fix(memory): clarify Dream prompt init UX
This commit is contained in:
@@ -419,20 +419,28 @@ async def cmd_dream_prompt(ctx: CommandContext) -> OutboundMessage:
|
|||||||
"""Show or set up the workspace Dream memory instructions."""
|
"""Show or set up the workspace Dream memory instructions."""
|
||||||
store = ctx.loop.context.memory
|
store = ctx.loop.context.memory
|
||||||
path = store.dream_prompt_file
|
path = store.dream_prompt_file
|
||||||
|
display_path = path.relative_to(store.workspace).as_posix()
|
||||||
args = ctx.args.strip().lower()
|
args = ctx.args.strip().lower()
|
||||||
|
|
||||||
if args == "init":
|
if args == "init":
|
||||||
if path.exists():
|
try:
|
||||||
|
prompt_exists_with_content = path.exists() and (
|
||||||
|
not path.is_file() or bool(path.read_text(encoding="utf-8").strip())
|
||||||
|
)
|
||||||
|
except OSError:
|
||||||
|
prompt_exists_with_content = True
|
||||||
|
if prompt_exists_with_content:
|
||||||
content = (
|
content = (
|
||||||
f"Dream memory instructions already exist at `{path}`.\n\n"
|
f"Dream memory instructions already exist at `{display_path}`.\n\n"
|
||||||
"Edit that file, or delete/empty it to return to nanobot's default."
|
"Edit that file, or delete/empty it to return to nanobot's default."
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
path.parent.mkdir(parents=True, exist_ok=True)
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
path.write_text(store.default_dream_prompt() + "\n", encoding="utf-8")
|
path.write_text(store.default_dream_prompt() + "\n", encoding="utf-8")
|
||||||
content = (
|
content = (
|
||||||
f"Created Dream memory instructions at `{path}`.\n\n"
|
f"Created Dream memory instructions at `{display_path}`.\n\n"
|
||||||
"Edit that file to teach Dream how to organize memory. "
|
"Edit that file to teach Dream how to organize memory. "
|
||||||
|
"This fully replaces nanobot's default Dream guide for this workspace. "
|
||||||
"Delete or empty it to return to nanobot's default."
|
"Delete or empty it to return to nanobot's default."
|
||||||
)
|
)
|
||||||
elif args:
|
elif args:
|
||||||
@@ -440,13 +448,13 @@ async def cmd_dream_prompt(ctx: CommandContext) -> OutboundMessage:
|
|||||||
elif store.has_dream_prompt_override():
|
elif store.has_dream_prompt_override():
|
||||||
content = (
|
content = (
|
||||||
"Dream memory instructions: custom for this workspace\n\n"
|
"Dream memory instructions: custom for this workspace\n\n"
|
||||||
f"- Path: `{path}`\n"
|
f"- Path: `{display_path}`\n"
|
||||||
"- Delete or empty this file to return to nanobot's default."
|
"- Delete or empty this file to return to nanobot's default."
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
content = (
|
content = (
|
||||||
"Dream memory instructions: nanobot default\n\n"
|
"Dream memory instructions: nanobot default\n\n"
|
||||||
f"- Editable file: `{path}`\n"
|
f"- Editable file: `{display_path}`\n"
|
||||||
"- Run `/dream-prompt init` to create an editable copy."
|
"- Run `/dream-prompt init` to create an editable copy."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -218,8 +218,8 @@ async def test_dream_prompt_reports_default_prompt(tmp_path) -> None:
|
|||||||
out = await cmd_dream_prompt(_make_dream_prompt_ctx(tmp_path))
|
out = await cmd_dream_prompt(_make_dream_prompt_ctx(tmp_path))
|
||||||
|
|
||||||
assert "Dream memory instructions: nanobot default" in out.content
|
assert "Dream memory instructions: nanobot default" in out.content
|
||||||
assert "prompts" in out.content
|
assert "prompts/dream.md" in out.content
|
||||||
assert "dream.md" in out.content
|
assert str(tmp_path) not in out.content
|
||||||
assert "/dream-prompt init" in out.content
|
assert "/dream-prompt init" in out.content
|
||||||
|
|
||||||
|
|
||||||
@@ -231,6 +231,9 @@ async def test_dream_prompt_init_copies_default_prompt(tmp_path) -> None:
|
|||||||
|
|
||||||
prompt_file = tmp_path / "prompts" / "dream.md"
|
prompt_file = tmp_path / "prompts" / "dream.md"
|
||||||
assert "Created Dream memory instructions" in out.content
|
assert "Created Dream memory instructions" in out.content
|
||||||
|
assert "prompts/dream.md" in out.content
|
||||||
|
assert str(tmp_path) not in out.content
|
||||||
|
assert "fully replaces nanobot's default Dream guide" in out.content
|
||||||
assert prompt_file.read_text(encoding="utf-8") == MemoryStore.default_dream_prompt() + "\n"
|
assert prompt_file.read_text(encoding="utf-8") == MemoryStore.default_dream_prompt() + "\n"
|
||||||
|
|
||||||
|
|
||||||
@@ -244,9 +247,24 @@ async def test_dream_prompt_init_does_not_overwrite_existing_prompt(tmp_path) ->
|
|||||||
out = await cmd_dream_prompt(ctx)
|
out = await cmd_dream_prompt(ctx)
|
||||||
|
|
||||||
assert "already exist" in out.content
|
assert "already exist" in out.content
|
||||||
|
assert "prompts/dream.md" in out.content
|
||||||
|
assert str(tmp_path) not in out.content
|
||||||
assert prompt_file.read_text(encoding="utf-8") == "custom"
|
assert prompt_file.read_text(encoding="utf-8") == "custom"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_dream_prompt_init_recreates_empty_prompt(tmp_path) -> None:
|
||||||
|
prompt_file = tmp_path / "prompts" / "dream.md"
|
||||||
|
prompt_file.parent.mkdir()
|
||||||
|
prompt_file.write_text(" \n", encoding="utf-8")
|
||||||
|
ctx = _make_dream_prompt_ctx(tmp_path, "/dream-prompt init", "init")
|
||||||
|
|
||||||
|
out = await cmd_dream_prompt(ctx)
|
||||||
|
|
||||||
|
assert "Created Dream memory instructions" in out.content
|
||||||
|
assert prompt_file.read_text(encoding="utf-8") == MemoryStore.default_dream_prompt() + "\n"
|
||||||
|
|
||||||
|
|
||||||
def test_dream_prompt_command_in_help_and_palette() -> None:
|
def test_dream_prompt_command_in_help_and_palette() -> None:
|
||||||
palette = builtin_command_palette()
|
palette = builtin_command_palette()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user