chameleon 2.58.0
Added
- A standalone
ruff.toml/.ruff.tomlis now read for formatting conventions.
_read_python_formatonly mined[tool.ruff]frompyproject.toml, so the
large population of repos that keep ruff config in a standalone file (ruff's
own.ruff.toml>ruff.toml>pyproject.tomldiscovery order) had their
line-length,quote-style,indent-style, andindent-widthsilently
dropped —rules_extractedcame back 0 and the derived formatting convention
was blank. The reader now resolves the ruff config the way ruff does: a
standalone file takes precedence over[tool.ruff]and the two are never
merged (matching ruff's real behavior), with black still read independently
from[tool.black]and the flake8/pycodestyle line-length fallback intact.
Thepyproject.toml-only path is unchanged. Verified end-to-end: a repo with
a standaloneruff.toml(line-length = 120,[format] quote-style = single)
now derivespython_format {line_length: 120, quote_style: single, source: ruff.toml}intorules.json. Found by the from-scratch QA sweep against a
real Django fixture.
Fixed
-
A resolved profile no longer advises bootstrapping a frontend it already
bootstrapped. A Python or Rails repo with a JS/TS frontend emits a
language_hinttelling the user to runbootstrap_repo(.../frontend)for the
JS half. When that frontend is a declared workspace, the same run already
bootstrapped it, so that advice is stale. Bootstrap now drops the hint from
the envelope,profile.json, AND the renderedprofile.summary.mdwhen a
successfully bootstrapped workspace IS that frontend subdir or lives inside it.
It is careful to only fire on the frontend-subdir hints: the other hint shape
(TypeScript won at the root but a sibling Ruby/Python tree lives somewhere in
the repo) names the whole repo root, and a package workspace never covers that
separate-language tree, so those hints always survive; an unrelated or
merely-ancestor workspace never suppresses a still-valid frontend hint either.
The reconciliation rides the shared derivation path, so a stale hint on an
existing profile is cleaned up on the next/chameleon-refresh. -
initializenow reports the chameleon build asserverInfo.version. The
stdio server passed no version to FastMCP, soserverInfo.versiondefaulted
to the installedmcpSDK's own package version (1.27.1) — a client could
not correlate the running server to the installed plugin. It now reports the
plugin build (2.58.0), set on the wrapped low-level server and guarded so a
future SDK internals change can never crash startup over a cosmetic string. -
describe_codebasedocuments its unsupported-schema shape. The docstring
promisedfound: Falseon an unresolvable/untrusted repo but did not cover a
resolved profile whoseschema_versionis newer than the engine supports,
which returnsfound: Truewithdegraded: Trueand the profile-derived
fields nulled — an honest "a profile exists but is unusable under this engine"
signal (distinct from "no profile at all"), the same statedetect_repo
reports asprofile_unsupported_schema_version. Behavior was already correct;
the contract is now accurate. Consumers must checkdegradedbefore reading
the derived fields.