Tools

Repository Author Commit message Committed SHA  
 
phpstan-rules by dg nette/database row type narrowing (table/related/ref/insert)

Narrows return types based on a configurable table-to-entity-class
mapping (nette.database.mapping.tables), which is not yet part of the
nette/database distribution. Kept as the topmost commit so the whole
feature can be excluded or rebased independently.

Includes:
- TableRowTypeResolver shared resolver
- Explorer::table() -> Selection<EntityRow>
- ActiveRow::related() -> GroupedSelection<EntityRow>
- ActiveRow::ref() -> ?EntityRow
- Selection::insert() -> mapped EntityRow

phpstan-rules by dg uses dresscode
phpstan-rules by dg support for PHP 8.6
phpstan-rules by dg cs
coding-standard by dg docs: the readme, the agent instructions and the internals of the package

The readme is what a project needs to switch to version 4, AGENTS.md what an
agent needs before touching this repository, and docs/internals.md how the
extension, the presets, the filter, the ecs entry point and the migration fit
together.

coding-standard by dg dogfood: dresscode.neon checks the own sources with the standard

The Coding Style workflow runs the check in CI, manually until DressCode is
published.

coding-standard by dg ConfigMigration: ecs migrate turns the version 3 configuration into dresscode.neon

ncs.php and ncs.xml are read through the rule aliases of DressCode and what
has no counterpart is reported instead of silently dropped. The fixers and the
sniff version 3 had of its own are translated here, since DressCode knows
nothing of them.

coding-standard by dg ecs: entry point accepting the version 3 command line

check and fix with paths, --fix, --no-progress, -V and -h are translated and
handed to DressCode. A php* preset of version 3 maps to the standard itself,
because the PHP version now comes from the project; optimize-fn, clean-code
and types map onto their preset classes. --config-file is refused with a
message pointing at dresscode.neon.

Without a configuration file the binary applies the standard, the extension
and the src and tests directories, which is what version 3 did by itself.

coding-standard by dg extension: a layer below the project carrying the presets and the filter

The presets of this package are reachable only by class until something
registers them, and the exclusions and the file filter version 3 had built in
have to arrive somehow too. The extension carries all three, so a project
names it in dresscode.neon next to the dresscode/nette preset. It enables no
preset: which of them apply is the decision of the project, and since the
extension is a layer below it, the configuration file overrides whatever it
likes.

coding-standard by dg preset: nette/types adds native types from annotations

Parameters, return values and properties take them from their annotations,
and a nullable type is written ?T.

coding-standard by dg preset: nette/clean-code adds the rules beyond the plain style

Strict comparisons, no useless else, final internal classes, no unset on
properties, ternaries, direct calls of invokables, no type kind in a name,
early exits and static closures.

coding-standard by dg preset: nette/optimize-fn imports the optimized global functions

The rule imports the functions the PHP compiler replaces with an opcode when
it knows them as global, and along with them the PHP_* constants and
DIRECTORY_SEPARATOR.

coding-standard by dg PhpVersionFilter: skipWhen predicate for the @phpVersion annotation

A file declaring a newer version than the runtime is left unchecked. The
annotation is matched anywhere in the file content, so a file that merely
quotes it is skipped too.

coding-standard by dg skeleton of version 4

The composer manifest, the CI workflows and the test bootstrap. The package is
a plugin of DressCode, not a checker of its own: the engine, the rules and the
configuration API all come from there.

mcp-inspector by dg added AGENTS.md
mcp-inspector by dg added Tracy toolkit: log files by level and exception report summaries
mcp-inspector by dg added DI container toolkit: services, autowiring, tags, aliases and masked parameters over Container::getServiceDescriptors()
mcp-inspector by dg added database toolkit: schema introspection and db_query with read-only policy enforced by validation and a read-only transaction
mcp-inspector by dg added router toolkit: routes, URL matching and link generation
mcp-inspector by dg added application toolkit: app_get_info with versions, packages, directories and database driver
mcp-inspector by dg added installer command
mcp-inspector by dg added inspector core: own DI container, live-reloading AppContainer, Server
claude-code by dg improved skills
command-line by dg CI: switched Coveralls upload to the official action

The php-coveralls phar is replaced by coverallsapp/github-action, which
resolves the token and the absolute paths in the Clover report on its
own, so tests/.coveralls.yml is no longer needed.

Coverage is now uploaded even when tests crash under phpdbg. Being
phpdbg-compatible is not a goal, but until now the failing step aborted
the job before the upload ever ran. The job-level continue-on-error is
gone, so genuine failures, including a rejected upload, are visible.

vite-plugin by dg dropped support for Node.js 20, requires Node.js 22+ (BC break)

Node.js 20 reached end of life in April 2026. The CI matrix now runs
22 and 24, package.json declares engines >= 22, and the runtime guard
around fs.globSync is gone, so glob entries work on every supported
version. Also bumped actions/setup-node from v4 to v7.

vite-plugin by dg readme: rewrote as a full feature overview

Documents every plugin option (entry, refresh, host, appUrl, infoFile),
the Vite defaults the plugin injects, dev-mode detection via the info file,
and the CORS/Docker/proxy/network recipes.

vite-plugin by dg released version 1.1.0
vite-plugin by dg fix: guard glob entries on Node < 22 and de-duplicate exit cleanup

Review follow-ups:
- fs.globSync exists only on Node 22+, but Vite 6 supports Node 18+;
a glob entry on an older runtime threw a cryptic 'not a function'.
Throw a clear error from the glob branch instead.
- The signal handler removed info files and then called process.exit(0),
which re-ran the same cleanup via the 'exit' handler. Let signals just
exit; the single 'exit' handler owns cleanup.

claude-code by dg Released version 1.2.0
claude-code by dg skills: added seven skills for areas nothing covered

Nette\Security appeared in no skill at all; the same held for sessions,
routing, caching, mail, the component tree and the retired-name lookup.

The scope of each was set by measuring what models actually produce rather
than by the size of the documentation, so they document the traps instead of
teaching the topic and are far shorter than a full guide. Every claim was
verified against the library source at a named tag, most of them by running
the code, and all seven were then re-checked by an independent pass.

- nette-security: the Authenticator contract and its error codes,
SimpleIdentity against the 2.x names, Passwords as a service with instance
methods, logout() keeping the identity, sliding expiration, the Permission
ACL including last-parent-wins, IdentityHandler for stale roles
- nette-components: factories, signals and where they run, why a form submit
is not a signal, what {plink} really is, persistent parameters,
redrawControl against the nonexistent invalidateControl, payload.redirect
during AJAX, dynamic snippets, the argument-free getComponents()
- nette-routing: that route order governs link generation and not only
matching, one-way routes, filter order, canonicalization, and that
cache: true cannot serialize a closure filter
- nette-http: the Sec-Fetch based CSRF protection, that any non-browser
client fails it quietly, sessions through set/get/remove, the proxy trap,
and the SSRF UrlValidator
- nette-caching: Cache::Expire rather than Expiration, remove() rather than
the nonexistent forget(), which storages need a journal, and that a closure
in Cache::Callbacks is a fatal because the dependency is serialized
- nette-mail: setHtmlBody auto-embedding, addEmbeddedFile returning a
MimePart that must not be concatenated, SmtpMailer having no default
credentials, and the 4.2 additions
- nette-upgrading: retired name to current name across all packages, sorted
by whether the old name still resolves; the aliases sit in an if (false)
branch, so the IDE and PHPStan flag them while nothing fires at runtime

claude-code by dg skills: documented Latte 3.1 smart HTML attributes

Printing an attribute is the most common thing a template does and 3.1
changed how it behaves, so a model trained on older Latte writes 3.0 code.
Every example here was produced by running it.

Covers the bool, tristate, valued-bool, list, style, data and aria
categories, that the handling applies only when the whole value is one
{...} expression, that a keyed array item counts only when its value is
=== true, and the traps: URL attributes are exempt through the internal
checkUrl filter, and a real filter stringifies the value and defeats the
whole mechanism.

Also prefers class={[...]} over n:class and attribute values over n:attr,
while saying plainly that neither is deprecated and that n:attr remains the
only way to express a dynamic set or name of attributes. Rewriting is not
mechanical: n:class de-duplicates the list and the attribute form does not.

claude-code by dg skills: corrected and extended the existing skills

Every claim was checked against the library source, most of it by executing
the snippet; several skills were then re-checked by an independent pass.

- architecture: the lifecycle had signals inside the action phase; they run
after it and after canonicalization. Added afterRender, shutdown, the
events, and that parent::startup() is enforced
- configuration: only presenters are auto-registered, not components; added
generated factories and accessors (implement:)
- forms: {form} attributes need a comma, Numeric is a non-negative integer
rather than an alias for Integer, corrected the renderer wrapper keys,
Nette\Application\UI\Form belongs in a presenter, onValidate must read
values with getUntrustedValues(), and CSRF is now Sec-Fetch based
- database: array keys in where() are SQL, keywords in fragments must be
uppercase, the empty-array trap, transaction() nesting and its return value
- utils: Callback::closure() and Type::allowsNull() do not exist, corrected
the expected output of isBuiltin(), typeToExtension() and firstLower();
added Process, DateTimeImmutable and the Html escaping contract
- tester: annotations, TestCase, helpers and CLI flags; a test with no
assertion is an error and exit() counts as a pass; @phpVersion with a
three-component version skips the very version it requires
- phpstan: the extension reports errors of its own and forces stricter flags
on, so some errors exist only because it is installed
- assets: a Vite mapper needs an explicit path; documented the plugin options
and that refresh, appUrl and host: network are not in the npm release yet
- neon: spaces are valid indentation too, tabs are only a convention

Last synchronization: 2026-09-26 01:02:37