Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
380 commits
Select commit Hold shift + click to select a range
b219536
Revert "feat!: container.name = display name (breaking) — loaders + g…
ChS23 May 18, 2026
f354862
fix(parser): structurizr DSL parser uses assignedIdentifier as Contai…
ChS23 May 18, 2026
2674769
feat(parser): emit duplicate-identifier ModelIssue on re-registration
ChS23 May 18, 2026
312c376
feat(parser): nested groups join names via structurizr.groupSeparator
ChS23 May 18, 2026
0dd71b2
feat(parser): `group "<name>"` inside element body sets properties.group
ChS23 May 18, 2026
20485d5
feat(parser): reopen body accepts new nested element declarations
ChS23 May 18, 2026
c2b6869
feat(parser): pre-lex \${NAME} substitution from !const/!var
ChS23 May 18, 2026
3eddc6f
feat(model): surface workspace name/description/extends in Model.work…
ChS23 May 18, 2026
1be2589
feat(parser): strip archetypes + selector blocks; document remaining …
ChS23 May 18, 2026
9eb3680
fix(parser): tag = tags alias + !const at any scope + grammar.md fide…
ChS23 May 18, 2026
56a06fc
feat(plantuml): chevrotain parser for C4-PUML
ChS23 May 19, 2026
642ff23
refactor(plantuml): cutover load.ts to chevrotain parser
ChS23 May 19, 2026
1943368
fix: close cross-cutting gaps surfaced by PUML parser cutover
ChS23 May 19, 2026
8357132
test(plantuml): pin two preParse edge cases
ChS23 May 19, 2026
fc89096
chore: release v3.0.0-beta.6
ChS23 May 19, 2026
8b65fcc
chore: release v3.0.0-beta.7
ChS23 May 19, 2026
a43c0ad
fix(plantuml): sourceLocation on dangling-source placeholder containers
ChS23 May 19, 2026
1081e7c
feat(cli): osc8 hyperlinks on violations + github annotation anchors
ChS23 May 19, 2026
43458ee
feat(cli): lint-style violation output with precise source anchoring
ChS23 May 19, 2026
eedd7a0
feat(rules): name-pattern role detection (Safin feedback)
ChS23 May 19, 2026
6d74d9e
chore: release v3.0.0-beta.8
ChS23 May 19, 2026
5a3abd0
fix(cli): consistent meta.name on every command
ChS23 May 19, 2026
e9bd5b3
docs(changelog): drop named contributor attribution in beta.8 entry
ChS23 May 19, 2026
0aefccd
refactor(api)!: rename Container→Element + restore coverage floor
ChS23 May 19, 2026
5affae8
feat(init): demo name-pattern detection in starter scaffold
ChS23 May 19, 2026
6edbb12
chore: release v3.0.0-beta.9
ChS23 May 19, 2026
31b2a3d
refactor(fix)!: range-based edits replace string matching
ChS23 May 19, 2026
2373915
refactor(syntax)!: relationDecl takes opts {description, technology, …
ChS23 May 19, 2026
c9af54f
docs(model): clarify SourcePosition.offset is UTF-16 code units
ChS23 May 19, 2026
b8bfa06
chore(lint): clean repo-level lint state for IDE
ChS23 May 19, 2026
f84b044
test(plantuml): drop stale Component_Boundary placeholder
ChS23 May 19, 2026
0091523
chore(lint): layer-calibrated cognitive-complexity thresholds
ChS23 May 19, 2026
6bf76e0
feat(api): expose missing types so library users can name them
ChS23 May 19, 2026
1c4e712
refactor(api)!: rename Violation.element to target + targetKind
ChS23 May 19, 2026
cac1fc1
docs: replace misleading "byte" terminology with "source/code-unit"
ChS23 May 19, 2026
35c9cb2
chore: release v3.0.0-beta.11
ChS23 May 19, 2026
d483762
chore(lint): break the prettier/unicorn hex-casing tie
ChS23 May 19, 2026
0494e22
feat(check): sarif v2.1.0 output mode for github code scanning
ChS23 May 19, 2026
7bdf9bf
chore: release v3.0.0-beta.12
ChS23 May 19, 2026
56d9631
fix(sarif): handle tool errors + emit repo-relative artifact uris
ChS23 May 19, 2026
775d627
feat(rules): export options types for the 4 option-less rules
ChS23 May 19, 2026
07adf3d
fix(sarif): primaryLocationLineHash, pathToFileURL, git-root base
ChS23 May 19, 2026
1054289
feat(config): allow boolean | options for the 4 option-less rules
ChS23 May 19, 2026
2438239
docs: changelog entries for beta.13 (SARIF fixes + options symmetry)
ChS23 May 19, 2026
55e2029
chore: release v3.0.0-beta.13
ChS23 May 19, 2026
0f001ce
feat(check,model): rule catalogue in check.data + new aact model command
ChS23 May 19, 2026
f71a4ed
docs: add AGENTS.md for AI coding agents
ChS23 May 19, 2026
f69a063
docs: add English README and bilingual switcher
ChS23 May 19, 2026
432b5ba
docs: symlink .github/copilot-instructions.md to AGENTS.md
ChS23 May 19, 2026
a9dbfb1
docs: add "AI agents" quickstart to README
ChS23 May 19, 2026
a321220
test(model): unit + e2e coverage for aact model and modelSarif
ChS23 May 19, 2026
41a13e8
feat(api): expose envelope contract and per-command data shapes
ChS23 May 19, 2026
0bdd45b
docs(changelog): unreleased entries covering all beta.14 work
ChS23 May 19, 2026
3ce25bb
docs(changelog): fix bullet split mangled by prettier reflow
ChS23 May 19, 2026
1265d91
docs: surface aact model in README, README.en and AGENTS.md
ChS23 May 19, 2026
db6bab8
chore: release v3.0.0-beta.14
ChS23 May 19, 2026
23e6673
fix(cli): per-terminal OSC 8 URL scheme so line:col navigation works
ChS23 May 19, 2026
2b1dc55
refactor(analyze)!: structural metrics that work on any DSL out of th…
ChS23 May 19, 2026
ccede7c
docs(agents): clarify schemaVersion freezes at v3.0.0 GA, not within …
ChS23 May 19, 2026
d15739d
chore: release v3.0.0-beta.15
ChS23 May 19, 2026
319016c
fix(cli): surface c12-resolved configPath in envelope.meta
ChS23 May 19, 2026
6a8ddb1
feat(rules)!: per-rule anchors + relatedLocations across text/json/sarif
ChS23 May 19, 2026
41e8c56
fix(rules,k8s)!: unify database-kind detection through isDatabaseElem…
ChS23 May 19, 2026
72c28a9
feat(rule): aact rule explain <name> + rationale/examples/adr on Rule…
ChS23 May 19, 2026
b3062e5
feat(cli): aact diff <baseline> [<current>] — structural PR-review diff
ChS23 May 20, 2026
8fe5619
feat(formats): model-json — registered Format (load + generate, no fix)
ChS23 May 20, 2026
ba136a5
fix(model-json): preserve envelope.data.issues, drop double validateM…
ChS23 May 20, 2026
6b3cb49
fix(model-json): filter envelope.data.issues to loader-only kinds
ChS23 May 20, 2026
b2e4d99
fix(model-json): shrink LOADER_ONLY_ISSUE_KINDS to duplicate-identifier
ChS23 May 20, 2026
c9d524e
docs(model-json): fix stale 'unchanged' wording on preIssues comment
ChS23 May 20, 2026
83f7445
chore: release v3.0.0-beta.16
ChS23 May 20, 2026
c9ca42c
fix(ci): move build approval to pnpm-workspace.yaml allowBuilds
ChS23 May 20, 2026
e1122a0
ci: fetch parser reference fixtures before tests
ChS23 May 20, 2026
8cb0f03
test: neutralise NO_COLOR and GITHUB_ACTIONS in vitest env
ChS23 May 20, 2026
5358a19
refactor(check): take render mode as explicit arg; tests strip ANSI
ChS23 May 20, 2026
81b9d81
test(check): property-based coverage for renderCheckText mode option
ChS23 May 20, 2026
1a53748
test(mutation): expand Stryker scope to diff, config, cli/output
ChS23 May 20, 2026
9c6f87c
test(diff): kill 118 surviving mutants in computeDiff
ChS23 May 20, 2026
5e21225
test(config): schema acceptance/rejection sweep — 35→100 mutation score
ChS23 May 20, 2026
a3cc97d
feat(check): relativise file paths in text-mode anchors
ChS23 May 20, 2026
70c259f
fix(check): relativise paths in dry-run preview and fix diagnostics
ChS23 May 20, 2026
e1b314d
fix(rule): point helpUri at the rule's ADR, drop dead README anchors
ChS23 May 20, 2026
cd59e7e
fix(cli): relativise paths in diff header and generate output messages
ChS23 May 20, 2026
0fd4c8c
fix(reporter): stop double-printing the primary diagnostic on errors
ChS23 May 20, 2026
d78d1ab
fix(generate): handle outputPath null in display path call
ChS23 May 20, 2026
54b98da
fix(envelope): canonicalise meta.source to an absolute path
ChS23 May 20, 2026
a1414bf
feat(model-json): emit $schema for IDE auto-validation of *.aact.json
ChS23 May 20, 2026
c00ec9f
fix(schema): clean review fallout from $schema landing PR
ChS23 May 20, 2026
aa4d1e1
chore(schema): drop stray blank line from generate-schema script
ChS23 May 20, 2026
61203db
chore(lint): clear all knip + sonarjs warnings on the v3 branch
ChS23 May 20, 2026
24e5e39
fix(structurizr): skip linkedRelationshipId edges as view duplicates
ChS23 May 20, 2026
01544f0
feat(plantuml-parser): cover real-world C4-PlantUML corpus edge cases
ChS23 May 20, 2026
9e77413
feat(structurizr-parser): kind/external inference + recoverable CST +…
ChS23 May 20, 2026
daa2e0a
fix(config): resolve source.path / writePath against the config file
ChS23 May 20, 2026
b5fd57c
fix(structurizr): drop structurizr.dsl.identifier from element proper…
ChS23 May 20, 2026
414295c
chore: release v3.0.0-beta.17
ChS23 May 20, 2026
f7deebf
chore(prepare): skip husky outside a git checkout
ChS23 May 20, 2026
0ee4628
ci(user-smoke): walk every public CLI flow end-to-end on a fresh project
ChS23 May 20, 2026
c63b631
feat(plantuml): preserve SetPropertyHeader/AddProperty rows on Model
ChS23 May 20, 2026
edaf1bd
docs(format-coverage): mark Boundary/Relation properties ✓ for PUML too
ChS23 May 20, 2026
0175a9d
fix(plantuml): named-arg AddProperty + escape-safe round-trip + bak i…
ChS23 May 20, 2026
9ac9441
ci(user-smoke): clear GITHUB_ACTIONS for the smoke block
ChS23 May 20, 2026
b5568c0
ci(user-smoke): unset GITHUB_ACTIONS at the start of the shell block
ChS23 May 20, 2026
171616d
fix(plantuml): drop whitespace-only AddProperty keys
ChS23 May 20, 2026
1d9acbb
fix(structurizr): drop groups from boundary elementNames + identifier…
ChS23 May 20, 2026
aca34eb
fix(structurizr): body-form `group "Layer"` is a property, not a boun…
ChS23 May 20, 2026
552a11c
chore: release v3.0.0-beta.18
ChS23 May 20, 2026
d305505
chore(init): ship stableDependencies: false by default
ChS23 May 20, 2026
0d785ec
fix(structurizr): exclude nested boundaries from rootBoundaryNames
ChS23 May 20, 2026
5bd8eb0
docs(view): adr for `aact view` — local architecture workbench
ChS23 May 20, 2026
9f9eecd
docs(view): finalise stack + integration pattern after 2026 stack survey
ChS23 May 20, 2026
1e8b2bf
feat(view): phase 0 — `@aact/view` companion skeleton + `aact view` s…
ChS23 May 20, 2026
2531b93
feat(view): phase 1 — h3 server + chokidar watcher + drill-down ui
ChS23 May 20, 2026
484f965
feat(view): swap inline HTML for Svelte Flow + ELK SPA
ChS23 May 20, 2026
e8dec62
fix(view): wire node click + cross-boundary edge aggregation
ChS23 May 20, 2026
f60dee5
feat(view): 3 view modes + C4 visual language
ChS23 May 20, 2026
2d9436b
fix(view): pass edges into ELK input so nested layout flows LR
ChS23 May 20, 2026
d46fbbe
fix(view): visible arrowheads and edge labels
ChS23 May 20, 2026
2e9a28b
fix(view): override xyflow css variables so edges stop looking pale
ChS23 May 20, 2026
c8872aa
fix(view): edge labels render as html div, style accordingly
ChS23 May 20, 2026
abafdfc
fix(view): replace person silhouette gradients with inline svg
ChS23 May 20, 2026
55a1b97
fix(view): clear boundary header from child overlap
ChS23 May 20, 2026
61aceac
docs(view): design.md captures visual language + interaction model
ChS23 May 21, 2026
e8f7f7e
fix(view): smooth viewport pan-zoom on layout change
ChS23 May 21, 2026
2454e07
fix(view): visible arrowheads — hide connection handles + brighter ma…
ChS23 May 21, 2026
8e738b6
feat(view): smoothstep edges + orthogonal routing for dense graphs
ChS23 May 21, 2026
a4792c4
feat(view): topbar toggle for edge style (curve / smooth / step)
ChS23 May 21, 2026
e483bb9
feat(view): cross-boundary edge filter
ChS23 May 21, 2026
28245f5
fix(view): make cross-boundary filter visually obvious
ChS23 May 21, 2026
601eb72
feat(view): reactive node fills, keyboard nav, properties in details
ChS23 May 21, 2026
19ba2f9
feat(view): web worker layout, edge multiplicity, per-session auth, e…
ChS23 May 21, 2026
73ebd81
fix(view): worker bundle url resolves correctly under base="./"
ChS23 May 21, 2026
6fc4e5c
revert(view): run elk on main thread
ChS23 May 21, 2026
82534e5
docs(view): readme for @aact/view + changelog unreleased entry
ChS23 May 21, 2026
1995348
feat(view): thread configPath into companion + h3 ws upgrade hook
ChS23 May 21, 2026
34819e4
feat(view): prompt to install @aact/view when missing
ChS23 May 21, 2026
b0ce134
chore: release v3.0.0-beta.19
ChS23 May 21, 2026
5dab69d
chore: release v3.0.0-beta.20
ChS23 May 21, 2026
1344746
chore: release v3.0.0-beta.21
ChS23 May 21, 2026
818374e
chore: release v3.0.0-beta.22
ChS23 May 21, 2026
e16a61b
chore: release v3.0.0-beta.23
ChS23 May 21, 2026
8af9010
docs(adrs): infrastructure conformance via format api
ChS23 May 22, 2026
e6ab3eb
docs(adrs): infrastructure conformance — добавил reversibility-анализ
ChS23 May 22, 2026
42607d4
docs(adrs): infrastructure conformance — финальная версия
ChS23 May 22, 2026
89fdafa
docs(view): drop experimental status markers
ChS23 May 22, 2026
aadff21
feat(formats): per-Format options escape hatch
ChS23 May 22, 2026
828057d
feat(formats): docker compose loader
ChS23 May 22, 2026
790e898
feat(formats): compose loader — naming, skip, unified imageHeuristic
ChS23 May 22, 2026
d10f83b
fix(view): scope WS upgrades to /api/ws and surface layout errors
ChS23 May 22, 2026
5082f30
feat(formats): compose generator + close loader test gap
ChS23 May 22, 2026
c108d5b
feat(formats): auto-detect all 4 canonical compose filenames
ChS23 May 22, 2026
8485f7f
refactor(formats): move image heuristic to _shared/
ChS23 May 22, 2026
494d3a3
feat(structurizr): workspace body overrides, bare impliedRelationship…
ChS23 May 22, 2026
5a8154b
feat(formats): k8s loader — workloads, annotations, namespaces
ChS23 May 22, 2026
3cf1152
feat(formats): k8s relations + kustomize.resources chase
ChS23 May 22, 2026
7e06359
feat(structurizr): archetype alias usage with chained defaults
ChS23 May 22, 2026
f2a92cf
fix(diff): pass source.options + auto-detect k8s directories
ChS23 May 22, 2026
01b2f67
feat(structurizr): dsl generator with round-trip parity
ChS23 May 22, 2026
63923aa
fix(structurizr): dsl-source parity for config inference and --fix
ChS23 May 22, 2026
9aab381
feat(structurizr): archetype kind-default form + property/perspective…
ChS23 May 22, 2026
120aff5
fix(check): universal parse-error mapping + DSL fix re-check
ChS23 May 22, 2026
6ae9f0b
feat(config)!: drop source.writePath, JSON-source refuses --fix
ChS23 May 22, 2026
6f47aca
test: close coverage gap to clear 95% statements floor
ChS23 May 22, 2026
b9cac11
feat(view): analyze overlay — cycles on graph, metrics in sidebar
ChS23 May 22, 2026
331c5a6
docs: per-module READMEs for public contracts
ChS23 May 22, 2026
a95ebcf
test(diff): benchmark corpus for refactor scenarios
ChS23 May 22, 2026
1becc9f
feat(diff): hungarian assignment + multi-feature similarity
ChS23 May 22, 2026
3afab88
feat(diff): fixed-point rename detection for chain renames
ChS23 May 22, 2026
8da1a24
feat(diff): description + properties signals in rename similarity
ChS23 May 22, 2026
fca1fb3
feat(diff): change-group detectors — technologySwapped + introducedRe…
ChS23 May 22, 2026
34958de
feat(view): diff mode — colored overlay + sidebar diff panel
ChS23 May 22, 2026
bb2a2ef
feat(view): zed-style topbar
ChS23 May 22, 2026
e4ab77b
feat(view): non-AI restyle — zed tokens, info-line stats, glyph diff …
ChS23 May 22, 2026
c11534d
chore: ignore docs/social-media local marketing drafts
ChS23 May 23, 2026
822e5ca
chore: release v3.0.0-beta.24
ChS23 May 23, 2026
3c07a84
chore: release v3.0.0-beta.25
ChS23 May 23, 2026
19e3e68
chore: release v3.0.0-beta.26
ChS23 May 23, 2026
e4258f8
docs: hero demo gif in README (RU + EN)
ChS23 May 23, 2026
3dc9b9e
chore: release v3.0.0-beta.27
ChS23 May 23, 2026
2b4ecb8
chore: release v3.0.0-beta.28
ChS23 May 23, 2026
f0dd104
fix: harden view release path
ChS23 May 27, 2026
475e86a
fix: harden c4 parser compatibility
ChS23 Jun 2, 2026
a5b7b69
fix(config): accept *NamePatterns rule options in schema
ChS23 Jun 9, 2026
94c175c
docs: add usage guides (modeling, CI, custom-rules, diff)
ChS23 Jun 9, 2026
878a565
docs: generate rule reference from registry
ChS23 Jun 9, 2026
7be3b4b
docs: extend reference generator to commands + formats
ChS23 Jun 9, 2026
3a08206
docs: use генерируется, not the colloquial генерится
ChS23 Jun 9, 2026
8b12a2a
docs: correct custom-rules violation count; trim roadmap
ChS23 Jun 9, 2026
6467006
ci: build before lint so @aact/view typecheck resolves aact
ChS23 Jun 9, 2026
e1f90ff
test: restore coverage to floor (95/85/95/95)
ChS23 Jun 9, 2026
0384bf5
ci: fix user-smoke fix-assertion; drop obsolete plantuml workflow
ChS23 Jun 10, 2026
7b28e03
feat!: make built-in rules opt-in (off unless configured)
ChS23 Jun 10, 2026
810ac32
docs: add configuring-rules guide
ChS23 Jun 10, 2026
8702ce6
docs: add analyze guide
ChS23 Jun 10, 2026
d158b45
docs: add check guide
ChS23 Jun 10, 2026
ec330f8
docs: add explore-view guide (text; asset pending)
ChS23 Jun 10, 2026
23af7b6
docs: explore-view workbench screenshot
ChS23 Jun 10, 2026
ef575d9
fix(cli): load config via jiti import to silence Node ESM warning
ChS23 Jun 10, 2026
58b6c77
fix(generate): treat trailing-slash or existing-dir --output as direc…
ChS23 Jun 10, 2026
580ceb6
ci: assert clean stderr and k8s directory output in user-smoke
ChS23 Jun 10, 2026
628d0da
chore: drop stale @tsconfig/svelte knip ignore
ChS23 Jun 10, 2026
eb0ba80
ci: run user-smoke on windows too
ChS23 Jun 10, 2026
040ecf6
fix(cli): no ANSI in redirected output on Windows
ChS23 Jun 10, 2026
726ae1d
docs: proper guides index README
ChS23 Jun 10, 2026
c364737
docs: fix awkward guides section heading
ChS23 Jun 10, 2026
c720faa
chore: release v3.0.0-beta.29
ChS23 Jun 10, 2026
ca480fc
refactor(cli)!: unify rule identifier as `ruleId` across the JSON con…
ChS23 Jun 21, 2026
7da43aa
refactor(cli)!: reserve severity union and reshape CheckSummary
ChS23 Jun 21, 2026
2d9746c
docs(cli): document issues-as-canon and single-source meta intent
ChS23 Jun 21, 2026
ef33d1c
refactor(analyze): make AnalysisReport and sub-types readonly
ChS23 Jun 21, 2026
2f58f2b
fix(cli)!: unknown rule in config.rules is a hard error (exit 2)
ChS23 Jun 21, 2026
98ede45
test(cli): cover warning/note severity rendering
ChS23 Jun 21, 2026
31588df
chore: unblock prepublish (tsconfig rootDir, ignore research bench in…
ChS23 Jun 21, 2026
946c1f3
fix(cli)!: reconcile severity and SARIF rule passports
ChS23 Jun 21, 2026
dc63f9b
docs: fix stale envelope contract references
ChS23 Jun 21, 2026
9e656ac
refactor(cli)!: share one rule resolver across check and rule commands
ChS23 Jun 21, 2026
c089a39
docs(cli): align Diagnostic.severity with the contract
ChS23 Jun 21, 2026
81c453a
fix(cli): report generate file size in UTF-8 bytes
ChS23 Jun 21, 2026
eea3663
feat(api): export format objects and relax model-json schema
ChS23 Jun 21, 2026
36a4b74
docs(view): distinguish CLI ViewData from the live workbench protocol
ChS23 Jun 21, 2026
395d637
fix(view): pass source.options to format.load; fix knip entry config
ChS23 Jun 21, 2026
9a512bc
feat(config)!: per-format generate options under config.generate.<for…
ChS23 Jun 21, 2026
cf47ac1
test(cli): cover config.generate.<format> wiring; clarify options docs
ChS23 Jun 21, 2026
6a9883c
docs(readme): list custom-rules + common-reuse in examples sections
ChS23 Jun 21, 2026
4c482c0
chore(dx): align pnpm scripts and node support docs
ChS23 Jun 21, 2026
72a06b4
chore: release v3.0.0
ChS23 Jun 21, 2026
93bbb57
docs(guides): document naming-pattern config; russify English filler
ChS23 Jun 21, 2026
94aefca
refactor(model)!: drop implicit Structurizr styling tags from Model.tags
ChS23 Jun 25, 2026
d6b2f55
feat(cli): accept a positional source for model / check / analyze
ChS23 Jun 25, 2026
9c84008
docs(guides): add aact <-> Kubernetes guide + kubernetes-drift example
ChS23 Jun 25, 2026
dfe430a
refactor(model)!: strip the External tag too; centralize in buildModel
ChS23 Jun 25, 2026
b0c1974
docs(guides): retitle the k8s guide to architecture-conformance (AaC …
ChS23 Jun 25, 2026
44b789f
feat(kubernetes)!: emit real, kubectl-appliable manifests from generate
ChS23 Jun 25, 2026
82beed8
docs(guides): proofread conformance guide; document the real generate
ChS23 Jun 25, 2026
13fcea9
docs(guides): add "aact as a library" guide + library-api example
ChS23 Jun 25, 2026
4dbde9a
fix(plantuml): sanitise names into valid aliases on generate
ChS23 Jun 26, 2026
c96e2fc
docs(guides): add cascade coupling reduction (CCR) guide
ChS23 Jun 26, 2026
7d98a50
docs(guides): regroup the guides index after the new guides
ChS23 Jun 26, 2026
515c830
docs(guides): add getting-started guide (init → check → --fix)
ChS23 Jun 26, 2026
7ab1b52
docs(guides): link configuring-rules from getting-started
ChS23 Jun 26, 2026
b471828
docs(guides): add agent-contract guide (--json envelope, model/rule, …
ChS23 Jun 26, 2026
8c9c8f0
docs(guides): add diagrams to cascade-coupling + conformance, demo gi…
ChS23 Jun 26, 2026
c7a32ca
refactor(api)!: explicit root barrel; loadBaseline into public diff
ChS23 Jun 26, 2026
beefef6
feat(cli): aact generate accepts a positional source
ChS23 Jun 26, 2026
b889322
fix(compose): emit build context for image-less services
ChS23 Jun 26, 2026
9d03225
fix(plantuml): escape Creole markup in generated text
ChS23 Jun 26, 2026
f557d1a
refactor: extract load/diff helpers; tighten untyped data
ChS23 Jun 26, 2026
eeef1e9
fix(plantuml): escape URLs in banking fixtures, regen diagrams
ChS23 Jun 26, 2026
f32db7f
build(view): lift chunk warning limit, add svelte.config
ChS23 Jun 26, 2026
f4e5bba
test(rules): silence consola.warn in resolveRedirectTarget cases
ChS23 Jun 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/copilot-instructions.md
40 changes: 0 additions & 40 deletions .github/workflows/main.yml

This file was deleted.

25 changes: 22 additions & 3 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x, 22.x]
node-version: [22.x, 24.x]
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
Expand All @@ -20,7 +20,26 @@ jobs:
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Fetch parser reference fixtures
run: bash scripts/fetch-parser-refs.sh
- name: Schema in sync with TS types
run: pnpm schema:check
- name: Rule reference in sync with registry
run: pnpm docs:check
# Build before Lint: `pnpm lint` typechecks @aact/view, which imports
# `aact` — its declarations must exist first.
- name: Build packages
run: pnpm build
- name: Lint
run: pnpm lint
- name: Test
run: pnpm test
- name: Pack smoke
run: pnpm pack:smoke
- name: Tests with coverage (unit + integration + e2e)
run: pnpm test:coverage
- name: Upload coverage report
if: matrix.node-version == '24.x'
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
retention-days: 14
217 changes: 217 additions & 0 deletions .github/workflows/user-smoke.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
name: user-smoke

# End-to-end walkthrough that exercises every public command the way
# a first-time user would: `init` a fresh project, run each CLI flow,
# inspect the JSON envelope shapes for required keys. Catches the
# class of "looked green in vitest but the CLI surface broke" bugs
# that slipped through previous betas (path display drift, $schema
# field missing, helpUri dead, reporter dedup, etc.).
#
# Built dist runs in a tmp directory disconnected from the repo so
# config-relative path resolution, cwd-relative display paths, and
# the OSC 8 fallback codepaths all see realistic input.

on:
- push
- pull_request

jobs:
user-smoke:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- name: Node.js
uses: actions/setup-node@v4
with:
node-version: 24.x
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build packages
run: pnpm build

- name: Smoke — full user walkthrough on a scratch project
# Explicit bash so the same script runs on the windows runner
# (default shell there is pwsh).
shell: bash
env:
# Drop AACT_FILE_OPENER so hyperlink builder picks its
# CI-safe default — runner has no TTY, anyway.
AACT_FILE_OPENER: none
run: |
set -euo pipefail
# The runner injects GITHUB_ACTIONS=true into every step;
# step-level `env: GITHUB_ACTIONS: ""` doesn't reach the
# spawned subprocesses. Unset it for this block so
# `renderCheckText` stays in human mode — the
# `::error file=...` annotation path is covered by
# check.test.ts.
unset GITHUB_ACTIONS
AACT="$GITHUB_WORKSPACE/dist/cli/index.mjs"
SMOKE_DIR="$RUNNER_TEMP/aact-smoke"
mkdir -p "$SMOKE_DIR"
cd "$SMOKE_DIR"

echo "::group::aact init"
node "$AACT" init
test -f aact.config.ts || { echo "init did not create aact.config.ts"; exit 1; }
test -f architecture.puml || { echo "init did not create architecture.puml"; exit 1; }
echo "::endgroup::"

echo "::group::aact check — expect violation (init seeds a CRUD violation)"
set +e
node "$AACT" check > check.txt 2> check.err
rc=$?
set -e
cat check.txt
if [ "$rc" -ne 1 ]; then
echo "::error::expected check to exit 1 on starter violation, got $rc"
cat check.err
exit 1
fi
grep -q "violations" check.txt || { echo "::error::check text mode missing 'violations'"; exit 1; }
grep -q "architecture.puml:" check.txt || { echo "::error::check text mode missing relativised path"; exit 1; }
echo "::endgroup::"

echo "::group::aact check --json — envelope shape"
set +e
node "$AACT" check --json > check.json 2> check-json.err
set -e
# The smoke dir has no package.json, so a bare native import of
# aact.config.ts makes Node grumble "Failed to load the ES
# module" on stderr — exactly what a fresh `npm init -y` user
# sees. Config loading must stay silent.
if [ -s check-json.err ]; then
echo "::error::check --json wrote to stderr:"
cat check-json.err
exit 1
fi
jq -e '.schemaVersion == 1' check.json > /dev/null
jq -e '.command == "check"' check.json > /dev/null
jq -e '.exitCode == 1' check.json > /dev/null
jq -e '.data.violations | length > 0' check.json > /dev/null
jq -e '.data.rules | length > 0' check.json > /dev/null
# Absolute = leading "/" on POSIX, "C:/" (pathe-normalised) on Windows.
jq -e '.meta.source | startswith("/") or test("^[A-Za-z]:/")' check.json > /dev/null \
|| { echo "::error::meta.source not absolute"; jq .meta check.json; exit 1; }
jq -e '.meta.configPath | startswith("/") or test("^[A-Za-z]:/")' check.json > /dev/null
echo "::endgroup::"

echo "::group::aact model --json — envelope shape"
node "$AACT" model --json > model.json
jq -e '.command == "model"' model.json > /dev/null
jq -e '.data.model.elements | length > 0' model.json > /dev/null
jq -e '.exitCode == 0' model.json > /dev/null
echo "::endgroup::"

echo "::group::aact analyze --json — envelope shape"
node "$AACT" analyze --json > analyze.json
jq -e '.command == "analyze"' analyze.json > /dev/null
jq -e '.data.boundaries | length >= 0' analyze.json > /dev/null
jq -e '.exitCode == 0' analyze.json > /dev/null
echo "::endgroup::"

echo "::group::aact diff <same> <same> — expect no changes"
set +e
node "$AACT" diff architecture.puml architecture.puml > diff.txt
rc=$?
set -e
cat diff.txt
if [ "$rc" -ne 0 ]; then echo "::error::diff of file with itself exited $rc"; exit 1; fi
grep -qi "no .*changes" diff.txt || { echo "::error::diff missing 'No structural changes' marker"; exit 1; }
grep -q "^aact diff architecture.puml architecture.puml" diff.txt \
|| { echo "::error::diff header missing relativised paths"; cat diff.txt; exit 1; }
echo "::endgroup::"

echo "::group::aact generate --format model-json — \$schema present"
node "$AACT" generate --format model-json --output ./snapshot.aact.json
test -f snapshot.aact.json
jq -e '."$schema"' snapshot.aact.json > /dev/null \
|| { echo "::error::generated model-json missing \$schema field"; head snapshot.aact.json; exit 1; }
jq -e '.schemaVersion == 1' snapshot.aact.json > /dev/null
jq -e '.model.elements | length > 0' snapshot.aact.json > /dev/null
# Round-trip: the model-json loader must accept the file we
# just emitted, exit cleanly and report no structural diff.
node "$AACT" diff ./snapshot.aact.json ./snapshot.aact.json > snap-diff.txt
grep -qi "no .*changes" snap-diff.txt
echo "::endgroup::"

echo "::group::aact generate --format kubernetes --output ./k8s/ — directory sink"
# AGENTS.md documents the trailing-slash directory form; it must
# work regardless of how many manifests the model produces.
node "$AACT" generate --format kubernetes --output ./k8s/
test -d k8s || { echo "::error::generate did not create ./k8s/"; exit 1; }
ls k8s/*.yaml > /dev/null || { echo "::error::no manifests written to ./k8s/"; exit 1; }
echo "::endgroup::"

echo "::group::aact rule list / explain"
node "$AACT" rule list > rule-list.txt
grep -q "acl" rule-list.txt
grep -q "crud" rule-list.txt
node "$AACT" rule explain acl > rule-explain.txt
grep -q "Rationale" rule-explain.txt
grep -q "Examples" rule-explain.txt
grep -q "ADRs/Anti-corruption Layer.md" rule-explain.txt
# Live ADR URL, not the dead README anchor.
grep -qF "https://github.com/Byndyusoft/aact/blob/main/ADRs/Anti-corruption%20Layer.md" rule-explain.txt \
|| { echo "::error::rule explain helpUri regressed to dead README anchor"; cat rule-explain.txt; exit 1; }
echo "::endgroup::"

echo "::group::aact check --fix — clears the starter violation"
set +e
node "$AACT" check --fix > fix.txt
set -e
cat fix.txt
grep -qi "applied" fix.txt || { echo "::error::check --fix did not apply edits"; exit 1; }
set +e
node "$AACT" check > recheck.txt
rc=$?
set -e
cat recheck.txt
if [ "$rc" -ne 0 ]; then echo "::error::expected clean check after --fix, got $rc"; exit 1; fi
grep -q "No violations found" recheck.txt
echo "::endgroup::"

echo "::group::aact check --sarif — GitHub Code Scanning shape"
# Re-seed a violation directly. `aact init` has no --force
# so we can't ask it to re-run on top of the just-fixed file;
# overwrite the source with a tiny known-violating PUML.
cat > architecture.puml <<'PUML'
@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
Container(orders, "Orders")
ContainerDb(orders_db, "Orders DB", "PostgreSQL")
Rel(orders, orders_db, "reads/writes")
@enduml
PUML
set +e
node "$AACT" check --sarif > check.sarif
set -e
# `aact check` exits 1 on the seeded crud violation; SARIF is
# still produced on stdout. Assert structural shape and that
# at least one result landed.
jq -e '.version == "2.1.0"' check.sarif > /dev/null
jq -e '."$schema" | contains("sarif")' check.sarif > /dev/null
jq -e '.runs[0].tool.driver.name == "aact"' check.sarif > /dev/null
jq -e '.runs[0].results | length > 0' check.sarif > /dev/null \
|| { echo "::error::SARIF produced no results — re-seed did not stick"; head check.sarif; exit 1; }
echo "::endgroup::"

echo "::group::aact bogus — unknown command path"
set +e
node "$AACT" bogus > /dev/null 2> bogus.err
rc=$?
set -e
# citty prints help and exits non-zero on unknown command;
# we only assert that the runner did not crash.
if [ "$rc" -eq 0 ]; then echo "::error::unknown command unexpectedly exited 0"; exit 1; fi
echo "::endgroup::"

echo "All smoke checks passed."
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

**/.scannerwork

### local-only marketing / pr drafts — never committed
/docs/social-media/

### https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore

.idea/*
Expand Down Expand Up @@ -204,3 +207,15 @@ package-lock.json
**/obj/*
**/nppBackup/*
.claude/

# Stryker mutation reports
reports/
.stryker-tmp/

# Local research drafts / notes
docs/research/

### v3 parser reference repositories — fetched on demand by scripts/fetch-parser-refs.sh.
### Studied for grammar and behaviour only, never copied verbatim into this repo (license firewall).
.parser-refs/
*.bak
10 changes: 10 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Auto-generated by `pnpm schema:gen`. The generator owns the
# canonical formatting (single-line enum arrays, draft-07 layout).
# Prettier would reflow into multi-line arrays that drift on every
# CI `schema:check` run.
schemas/

# Auto-generated by `pnpm docs:gen` from the rule registry. The
# generator owns the canonical formatting; prettier would reflow it
# into a diff on every `docs:check` run (same as schemas/ above).
docs/reference/
Loading
Loading