Repository navigation
Releases
Releases · SirCypkowskyy/inwards
v0.7.0
0.7.0 (2026-10-11)
Added
- cli: add inwards diagram to print the config as Mermaid or PlantUML (#383) (f83375a)
- cli: show diagram findings in the hook, the editor and MCP (#385) (06c400d)
- rules: add INW019 diagram-missing-dependency (#384) (cdac53f)
- rules: recognise FastAPI routers built at run time and in router factories (#394) (2008c3e), closes #358
- rules: skip test modules in the opt-in content rules (#389) (a8c282a)
Fixed
- rules: report a project's own INW016 naming scheme once (#390) (0596d16), closes #361
- rules: stop INW012 flagging markup trees, HTMX error answers and health checks (#396) (cf127b7), closes #360
Changed
- rules: parse each file once per run across the content rules (#393) (c38c5ae), closes #387
- rules: skip INW013 files that can't reach a blocking name in large runs (#386) (36acccc), closes #369
Documentation
v0.6.0
0.6.0 (2026-10-11)
Added
- cli: add check --format github for Actions annotations (#356) (c7bb0bd), closes #339
- cli: add init --agent claude --shared for committed hooks and MCP (#357) (7a7e187), closes #342
- cli: add inwards init --style auto that maps an existing project's packages (#371) (0cc09cb), closes #343
- cli: add inwards rules and inwards rule CODE (#355) (ffd74dc), closes #341
- cli: name the opt-in rules a project turns on in the architecture brief (#352) (bbb71a1), closes #336
- cli: turn on INW014 ports-abstract in the clean and hexagonal presets (#326) (d05dd3f), closes #317
- cli: turn on INW015 construct-only-in in the clean and hexagonal presets (#350) (cf6746e), closes #325
- cli: turn on INW016 and keep fastapi out of the domain core in the fastapi preset (#363) (16b2f30), closes #338
- cli: turn on module cycles in every init preset (#366) (3f9cb26), closes #340
- core: turn opt-in rules on per template role (#327) (5bdf5ad), closes #298
- rules: add INW014 ports-abstract so port modules hold only ABCs and Protocols (#312) (05d95c1), closes #98 #295
- rules: add INW015 construct-only-in so only the composition root imports and builds outbound adapters (#313) (f385d41), closes #98 #296
- rules: add INW016 orm-naming for table names and datetime and date column suffixes (#318) (2331d42), closes #98 #297
- rules: add INW017 diagram-unknown-name for marked Mermaid architecture diagrams (#354) (ab81e69)
- rules: add INW018 diagram-forbidden-edge and inwards import-diagram (#365) (bfb6a9f), closes #332 #345
- rules: read PlantUML component diagrams in INW017, INW018 and import-diagram (#373) (6d3ea63), closes #332 #346
Fixed
- cli: give every command its own --help and one-line usage errors (#351) (f316ca3), closes #335
- rules: cut false positives of the opt-in rules found on the corpus (#364) (a99ea2a), closes #182
- rules: don't count TYPE_CHECKING imports as INW004 cycle edges (#376) (7897c79)
- rules: report correct end positions for INW016 findings (#374) (67a4311), closes #370
Changed
Documentation
- add a getting-started guide for GitHub Copilot (#314) (71534ef), closes #67
- add setup pages for Neovim, Zed and Helix (#311) (92e27cc), closes #66
- decide Inwards hooks for Copilot in ADR-044 (#324) (46fee50), closes #316
- point install and CI at PyPI and the public repository (#353) (2b06d29), closes #334
- rules: group the rule catalogue by category and show presets (#368) (5ab4ff8), closes #337
v0.5.0
0.5.0 (2026-10-10)
Added
- cli: add
inwards mcp, an MCP server for checking code before it is written (#307) (2c15753), closes #65 - cli: add
inwards server, a language server over stdio in the binary (#300) (d170ae5), closes #63 - cli: add the fastapi preset to inwards init --style (#269) (77cb4a0), closes #238
- cli: map import-linter | siblings to sibling layer groups (#254) (d2ecd05)
- cli: serve PostToolUse from a resident inwards daemon (#274) (05b7186), closes #60
- cli: turn on INW012 thin-endpoint in the fastapi preset (#283) (08ad7c4), closes #272
- cli: turn on INW013 async-blocking in the fastapi preset (#303) (b3a030c), closes #302
- rules: add FAPI005 route-shadowing (#256) (bbefe6e)
- rules: add FAPI006 to FAPI009 (lifespan-events, yield-dependency-swallows, duplicate-operation-id, depends-called) (#260) (ce385f8), closes #225 #226 #227 #228
- rules: add INW012 thin-endpoint for FastAPI endpoints and custom decorators (#273) (c9eb992), closes #182
- rules: add INW013 async-blocking for sync database, cache and cloud calls in async def (#301) (a8ef8ce), closes #98 #293
- rules: count same-module helpers and registered routes in INW012 (#287) (4db9576), closes #271
- rules: deny a library to a module prefix with INW005's deny option (#245) (6efa426), closes #219
- rules: follow INW013 one hop into first-party sync helpers (#304) (214e95b), closes #98 #294
- rules: let a context's public list open a package facade with =pkg (#259) (79a2413)
- rules: name the concrete delegate-to module in INW012 fixes (#288) (337fc66)
- rules: read looped and splatted FAPI002 handler registrations, scope them per app (#264) (f2c266b), closes #242
- rules: recognise Flask, Litestar and Django endpoints in INW012 (#291) (e4d188b), closes #270
- vscode: start the bundled
inwards serverand publish to the Marketplace and Open VSX (#306) (0bda609), closes #64
Fixed
- cli: don't let a reused pid keep a dead daemon's lock (#285) (363b6c1), closes #276
- cli: keep a hung git call from blocking the daemon's queue (#290) (ec2bd65), closes #277
- cli: make SessionStart start-content copies on Windows (#253) (1d976eb)
- cli: stop starting a daemon on every edit when none can listen (#289) (b6358f9), closes #275
Changed
- cli: cut the serial part of a cold full check (#292) (c3ef8f3), closes #281
- cli: parse large full checks on worker threads (#282) (3dc5489), closes #61
- core: blank long runs of comment lines before the full parse (#255) (2fd428c)
- core: parse the hook's second check of a file incrementally (#299) (5411f97), closes #122
- core: read imports and suppression comments without walking the whole tree (#268) (5bfad70), closes #62
Documentation
- decide the resident process design in ADR-039 (#263) (73936df), closes #59
- give the docs site its own identity and a home page built on a real run (#250) (dc93f8a)
- point editor completion at SchemaStore and add the schema sync step (#249) (9c0bc74)
- rules: validate rule pages and add a filterable rule list (#265) (df00f56), closes #145
v0.4.0
0.4.0 (2026-09-28)
Added
- check every uv workspace member with its own config, and find namespace package portions in other members (#217) (8dbf052)
- cli: add vertical-slices, bounded-contexts and django presets, and make hexagonal adapters siblings (#239) (455ac94)
- cli: brief the agent on the architecture with inwards context and init --brief (#213) (2f590de)
- cli: convert import-linter contracts with inwards import-config (#220) (3949a5b)
- cli: write package shapes with init --style --scaffold (#218) (0ecc210)
- config: layer selectors such as shop.*.domain for vertical slices (#222) (68e66be)
- config: opt-in rules, extend-select and per-rule option tables (#223) (e87e464)
- config: package templates with role layering and independent sibling layers (#232) (80c75ad)
- hook: deny a Write that creates a Python file the package shape forbids (#215) (44f494a)
- hook: know the start content of files dirty or untracked at session start (#229) (a9f854d)
- rules: add FAPI001 endpoint-metadata and FAPI002 undocumented-error-response (#243) (d4b94ea)
- rules: FAPI003 router-wiring reports unmounted routers, inclusion cycles and early includes (#237) (188c201)
- rules: follow more loader routes and fold constant targets in INW011 (#216) (cfbd1ab)
- rules: register the FastAPI rule family (FAPI001-FAPI003, opt-in) and its shared model (#230) (a735af0)
Fixed
- cli: report a --config that isn't a file instead of crashing (#214) (8e21ec3)
- hook: catch a replayed SessionStart and a Stop hook removed through Bash (#240) (9f25ba2)
- hook: show what a Bash edit of [tool.inwards] hides by checking with the session-start config (#211) (c9981c4)
- rules: accept namespace package portions installed in the project's .venv, or listed in namespace-packages (#221) (164f5b0)
- rules: close the INW006 follow-ups for compiled modules, ignore depth and shadowing packages (#244) (59b52a1)
- rules: report symlinks in layers that point out of the root or into another layer (#231) (d9a7670)
Documentation
Chores
v0.3.1
0.3.1 (2026-09-28)
Added
- a content-keyed extraction cache for check and baseline (#194) (e478c15)
- cli: init --launcher "uv run" writes hooks and the AGENTS.md command without a binary path (#207) (4df19d7)
- cli: inwards init --agent opencode wires Inwards into OpenCode (#199) (32e6460)
- config: contexts table, a JSON Schema and a configuration reference (#193) (c4d5f8f)
- rules: call a uv workspace member a workspace package in INW005 (#204) (1c98fe6)
- rules: INW002 keeps each bounded context to the contexts it depends on (#195) (e839c3e)
- rules: INW003 keeps code outside a context to its public modules (#196) (76635a3)
- rules: INW004 reports import cycles between modules or contexts (#197) (ae212d2)
Fixed
- cli: warn about check paths outside the config root instead of reporting All clear (#205) (7906bb4)
- rules: warn when a uv workspace member is checked from the workspace root (#206) (b8c0ea7)
Documentation
v0.3.0
0.3.0 (2026-09-27)
⚠ BREAKING CHANGES
- rules: a dynamic import whose target isn't a string literal (
importlib.import_module(name),exec(code), …) in any layer but the outermost now failsinwards check(INW011). Use a literal or an import statement, move the loader to the outermost layer and pass what it loads in through a Protocol-typed parameter, or baseline it. - rules: a layered file that imports a first-party module that doesn't exist now fails
inwards check(INW010). Fix the import, create the module, or runinwards baseline. - rules: in a config with two or more layers, the innermost layer now denies 32 frameworks, database and network clients and standard-library I/O modules by default (INW005), so a domain that imports one of them, such as
sqlalchemy,requestsorsubprocess, failsinwards checkafter the upgrade. Move the import behind a port implemented in an outer layer, setdeny-libraries = []on the innermost layer to turn the default off, or runinwards baselineto accept the existing imports.
Added
- config: add extend-deny-libraries to add to the INW005 deny list instead of replacing it (#166) (b7bfa3b)
- config: let INW010 accept generated modules missing from a fresh checkout (#172) (943d227)
- config: per-rule select, ignore and severity in [tool.inwards.rules] (#162) (f78d2fd)
- core: make the module index an engine input for every adapter (#153) (8a40b82)
- lsp: show config errors in the editor and re-read pyproject.toml on change (#167) (c6013c7)
- rules: add INW005 to limit the libraries each layer may import (#151) (2a5cff1)
- rules: add INW010 to flag imports of first-party modules that don't exist (#159) (859a85d)
- rules: inline suppressions with a mandatory reason, rejected by default when an agent adds them (#165) (f75f47f)
- rules: link each diagnostic to its own rule page, with a docs page per rule (#173) (5712650)
- rules: report dynamic imports with unverifiable targets in inner layers (INW011) (#158) (492e8fc)
Fixed
- ci: cycle check and run-log test on macOS and Windows (#187) (d7bf6f8)
- hook: let read-only Bash chains and pipelines that name .inwards through the config guard (#152) (1e267e8)
- hooks: show project-relative paths through a symlinked root, and run doc snippets under bash 3.2 (#175) (8717831)
- hooks: stop INW007's pre-existing excuse from following symlink aliases (#171) (fb1f498)
- hook: stop blocking on violations a file already had at session start (#154) (6ae458b)
Documentation
- add a Polish translation at /pl/ with a page-keeping language switcher (#156) (7564422)
- drop the CI runners section from chapter 6 (#148) (7765501)
Chores
v0.2.0
0.2.0 (2026-09-26)
Added
- cli: add --format concise and --max-diagnostics (#117) (1b13098)
- cli: design-partner kit: guide, stats --export --redact, feedback form (#128) (c1b831a)
- cli: inwards baseline accepts existing violations (#105) (7da0555)
- cli: inwards init --style writes architecture presets, with an example scaffold and a picker (#125) (fb3aeea)
- cli: inwards stats computes the hypothesis numbers from the run log (#110) (6e46e39)
- rules: package shape with INW007 package-shape and INW008 missing-member (#123) (954671f)
Fixed
- cli: stats handles parallel sessions, stubs and projects outside git (#115) (87ccc6d)
- docs: quadrant chart and C1-C4 text unreadable in light theme (#140) (63a05df)
Changed
- compile the binaries with bytecode to halve start-up (#118) (f2f5325)
- skip the confirming parse for baselined violations and add a whole-project Stop gate (#139) (fb741b1)
Documentation
- agents: claim issues through linked branches and close them with a full report (#116) (6386972)
- bring the docs in line with what M1 shipped (#104) (98acd0e)
- fix diagram theming for dark mode, animate the homepage loop (#130) (c90a58c)
- record the M2 go or no-go decision (ADR-022) (#137) (b9b5c23)
Chores
v0.1.0-rc.1
What's Changed
- M0 · Ship a binary by @SirCypkowskyy in #68
- Placeholders: neutral text, no link to the private repo by @SirCypkowskyy in #70
- M0 wrap-up: docs match the code, finishing rule in AGENTS.md by @SirCypkowskyy in #72
- Rule registry: metadata in one place, SARIF rules[] built from it by @SirCypkowskyy in #73
- Docs CI: nav coverage and link checking by @SirCypkowskyy in #74
- Module index: every first-party module, importers on demand by @SirCypkowskyy in #75
- Session state: an append-only log per agent session by @SirCypkowskyy in #76
- inwards init --agent claude|aider|agents-md by @SirCypkowskyy in #77
- init: review fixes (exec form, settings.local.json, safe edits) by @SirCypkowskyy in #80
- INW011: report literal dynamic imports that reach an outer layer by @SirCypkowskyy in #78
- feat(cli): Stop gate checks what the session changed (#20) by @SirCypkowskyy in #82
- feat: INW006 unassigned-module and config integrity (#21) by @SirCypkowskyy in #85
- feat(cli): config guard on PreToolUse (#23) by @SirCypkowskyy in #87
- feat(cli): escalate to the user after repeated failures (#22) by @SirCypkowskyy in #89
- feat(cli): opt-in run log .inwards/runs.jsonl (#28) by @SirCypkowskyy in #90
- docs: getting-started guides for Claude Code, Aider and AGENTS.md (#25) by @SirCypkowskyy in #91
- feat: platform wheels with the binary inside, version 0.1.0 (#31) by @SirCypkowskyy in #94
New Contributors
- @SirCypkowskyy made their first contribution in #68
Full Changelog: https://github.com/SirCypkowskyy/inwards/commits/v0.1.0-rc.1