Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <Name>` 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).
Expand Down
13 changes: 12 additions & 1 deletion graphify/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
22 changes: 22 additions & 0 deletions tests/test_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading