diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a0daf515f..1dceea3bb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Full release notes with details on each version: [GitHub Releases](https://githu ## 0.9.63 (2026-09-16) +- Fix: `graphify install`'s completion message now names the platform it just installed for. Bare `graphify install` silently defaults to `claude`, and the old message named no platform at all — a user following a platform-neutral quick start for a different assistant (Codex, OpenCode) saw an apparently successful, generic message while the skill for their actual assistant was still absent, with nothing pointing them at `--platform` (#2263, thanks @Ranteck). + - Feature: Elixir `alias`/`import`/`require`/`use` targets now resolve onto the module's `defmodule` node across files, so the internal module dependency graph is no longer dropped as dangling. Only top-level modules are indexed (a nested `defmodule`, labeled with its bare inner name, cannot capture an unrelated `use ` from another file), and a same-file reference is left unresolved so it cannot clobber the structural `contains` edge (#3603, thanks @ayushcodes10). - Feature: a Rust `self.method()` call now resolves to a method defined on the same type in another file (the common split-`impl`-block layout), pooling methods across every `impl` of one type and refusing to link when two unrelated types share a bare name (#3602, thanks @ayushcodes10). - Feature: a Ruby member call `obj.foo` on a known-type receiver now resolves to a method `foo` inherited from a superclass, including across files, using the same conservative promotion as the implicit-self resolver — a single owning class, matching method kind, and one unambiguous ancestry chain, or it stays dangling (#3585, thanks @oleksii-tumanov). diff --git a/graphify/install.py b/graphify/install.py index 2fb2192760..cc29399b19 100644 --- a/graphify/install.py +++ b/graphify/install.py @@ -728,8 +728,19 @@ def install(platform: str = "claude", *, project: bool = False, project_dir: Pat if project: _print_project_git_add_hint([_project_scope_root(skill_dst, project_dir)]) + # #2263: bare `graphify install` silently defaults to claude, and the old + # completion message named no platform at all - a user following a + # platform-neutral quick start for e.g. Codex or OpenCode saw an + # apparently platform-neutral success message while the skill for their + # actual assistant was still absent. Name the platform explicitly, and + # give an example that is never the platform just installed. print() - print("Done. Open your AI coding assistant and type:") + print(f"Done. Installed the graphify skill for '{platform}'.") + example_platform = "codex" if platform != "codex" else "claude" + print(f"Wrong assistant? Re-run with e.g. `graphify install --platform {example_platform}`") + print("(see `graphify install --help` for the full platform list).") + print() + print("Open your AI coding assistant and type:") print() print(" /graphify .") print() diff --git a/tests/test_install.py b/tests/test_install.py index 72d4e4dd26..23318abb28 100644 --- a/tests/test_install.py +++ b/tests/test_install.py @@ -40,6 +40,28 @@ def test_install_default_claude(tmp_path): assert (tmp_path / ".claude" / "skills" / "graphify" / "SKILL.md").exists() +def test_install_completion_message_names_the_platform(tmp_path, capsys): + """#2263: the completion message must name which platform was installed, + and its "wrong assistant" example must never suggest the platform that + was just installed - so a Codex user following a platform-neutral quick + start (which defaults to claude) sees the mismatch instead of a generic + success message.""" + from graphify.__main__ import install + + old_cwd = Path.cwd() + try: + os.chdir(tmp_path) + with patch("graphify.__main__.Path.home", return_value=tmp_path): + install(platform="claude") + finally: + os.chdir(old_cwd) + + out = capsys.readouterr().out + assert "Installed the graphify skill for 'claude'." in out + assert "--platform claude" not in out + assert "--platform codex" in out + + def test_install_survives_a_winerror_17_replace(tmp_path, monkeypatch): """#3508: installing SKILL.md failed on some Windows setups with WinError 17 ("cannot move to a different disk drive") from `os.replace`, even with