-
Notifications
You must be signed in to change notification settings - Fork 482
feat(a11y): Accessibility Studio portlet + AI agent platform (@dotcms/ai, MCP server, agent UI) #36641
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
feat(a11y): Accessibility Studio portlet + AI agent platform (@dotcms/ai, MCP server, agent UI) #36641
Changes from all commits
Commits
Show all changes
179 commits
Select commit
Hold shift + click to select a range
f86fb60
docs(mcp-server): document binary-response envelope in execute tool
fmontes eb2ac73
docs(a11y-agent): add phased session plan + S0 spike findings
fmontes 0f552d5
feat(dotcms-agents): scaffold Nx Node app (Hono) for agent capabilities
fmontes a373801
feat(dotcms-agents): lock a11y-fix contract (zod schemas + tests)
fmontes 89fcf4b
feat(dotcms-agents): path-allowlist adapter wrapper (safety boundary …
fmontes c4db65e
feat(dotcms-agents): the a11y-fix loop (deterministic skeleton, §5)
fmontes 44f4e70
feat(dotcms-agents): HTTP layer — POST /a11y/fix + GET /a11y/active-run
fmontes f247900
fix(dotcms-agents): drop refuse-if-dirty; reach theme CSS/JS sources
fmontes 3f4e1f8
perf(dotcms-agents): default to Sonnet + cache triage file context
fmontes 1c3fb9b
feat(dotcms-agents): optional LLM usage sink for cost measurement
fmontes fd93b91
perf(dotcms-agents): don't send JavaScript to the agent
fmontes a12f4d9
feat(page): return ALL theme files in /_render-sources, not a type wh…
fmontes b5e2272
docs(a11y-agent): add S1.5 CSS attribution (deterministic, spike-vali…
fmontes b3abb0d
feat(dotcms-agents): add OpenRouter as a selectable LLM provider
fmontes 51b5930
feat(dotcms-agents): default to OpenRouter + moonshotai/kimi-k2.7-code
fmontes 8c250e7
fix(dotcms-agents): only send Anthropic cacheControl on the Anthropic…
fmontes 2702547
docs(a11y-agent): lock lazy per-violation source reading (S1.5)
fmontes 71114d7
docs(a11y-agent): close stylesheet-discovery decision; full lazy chai…
fmontes 31106ef
feat(a11y-studio): add Accessibility Studio portlet (S3 MVP)
fmontes fa1de8b
feat(dotcms-agents): css-attribution + css-source-map modules (S1.5 f…
fmontes 199c064
feat(dotcms-agents): wire lazy CSS-attribution path into the loop (S1.5)
fmontes 8fd63f5
feat(dotcms-agents): batch CSS re-scans + cap LLM output (S1.5 valida…
fmontes 7f7bf25
fix(dotcms-agents): exclude state-pseudo rules from CSS attribution
fmontes 0d83931
feat(dotcms-agents): adapt to raw-axe scanner response (normalize in …
fmontes aa07699
feat(dotcms-agents): deterministic contrast fix from axe data (no LLM)
fmontes 6f321b6
fix(dotcms-agents): attribute contrast by axe's flagged color, not sp…
fmontes 89b3796
feat(a11y-studio): render preview iframe via /dot-page proxy in EDIT_…
fmontes bc08ac5
feat(a11y-studio): consume raw axe-core scanner response in a11y report
fmontes 50bc6ca
fix(dotcms-agents): try both sides of the contrast pair (white-text f…
fmontes 13a45bc
fix(dotcms-agents): default to GLM-5.2 + retry transient empty LLM ou…
fmontes 215e2fe
feat(dotcms-agents): hybrid loop — deterministic PASS 1 + agentic res…
fmontes 0aa4911
perf(dotcms-agents): filter EDIT_MODE chrome + tighten PASS 2 prompt
fmontes 0dab40a
fix(dotcms-agents): only filter editor chrome, treat data-dot as attr…
fmontes c060a85
refactor(dotcms-agents): drop Output.object — tool-calling only, no f…
fmontes b60e8e1
refactor(dotcms-agents): /simplify cleanup — dedup helpers, cache, de…
fmontes 83ca684
feat(a11y-studio): run a real axe scan and feed the score widget
fmontes d7465a2
feat(a11y-studio): draw violation markers inside the preview iframe
fmontes 35c2b18
chore(a11y-studio): DEV-ONLY rewrite scan URL :4200 → :8080
fmontes bf0122d
fix(dotcms-agents): host-scope the stylesheet fetch (non-default sites)
fmontes 8c66b7a
revert(dotcms-agents): don't re-append host_id in fetchStylesheet
fmontes 0198e49
feat(dotcms-agents): honor scanner renderReliable — abort on broken r…
fmontes 4bb91c3
feat(dotcms-agents): scan in PREVIEW_MODE (working content, no editor…
fmontes c6d8d9a
feat(a11y-studio): live agent stream, preview modes, and dev/prod fixes
fmontes 79e62ad
refactor(dotcms-agents): restructure src into api/domain/dotcms/fix/s…
fmontes 595ecc8
refactor(dotcms-agents): depend on a DotcmsGateway port, not the conc…
fmontes 7e5f1c5
refactor(dotcms-agents): split run-fix into orchestrator + CSS engine…
fmontes e491199
refactor(dotcms-agents): extract request-parser and research prompt
fmontes b0d33f7
feat(agent-contracts): scaffold @dotcms/agent-contracts shared lib
fmontes 685ff9b
refactor(dotcms-agents): move a11y contract into @dotcms/agent-contracts
fmontes ed3e173
refactor(dot-accessibility-studio): consume @dotcms/agent-contracts (…
fmontes 8f8a4ed
fix(dotcms-agents): eliminate implicit any + enable noImplicitAny
fmontes 56aa313
refactor(agents-contract): rename lib folder/project dotcms-agents-co…
fmontes 70b5adc
refactor(ai-agents): rename app dotcms-agents → ai-agents (+ URL path)
fmontes d531560
feat(ai-agents): autoload repo .env so `nx serve ai-agents` just works
fmontes 119355a
feat(ai-agents): add Stop endpoint (cooperative run cancellation)
fmontes 5b98fa8
feat(agent-contracts): report changedFiles on every run (done or stop…
fmontes 264c235
feat(a11y-studio): rebuild the left panel to the new design (5 states)
fmontes 32bcd7a
feat(a11y-studio): surface needs-review (incomplete) count in the sco…
fmontes ed6143c
fix(a11y-studio): make the re-scan button work (allow runScan from sc…
fmontes 7fc6588
fix(a11y-studio): phase-aware marker overlay (not just LIVE-only)
fmontes dca4b46
feat(a11y-studio): explain axe 'incomplete' with a Needs-your-review …
fmontes 3431cdf
fix(a11y-studio): don't load the page picker until the current site i…
fmontes eafa4ae
refactor(a11y-agent): migrate from @dotcms/agentic-tools to @dotcms/ai
fmontes 330bc9d
fix(@dotcms/ai): wire package.json exports to compiled dist outputs
fmontes d3579a3
fix(a11y-agent): point dev proxy and server default port to localhost…
fmontes 4429323
fix(dev-proxy): rewrite /ai-agents/a11y to /agent/a11y for combined s…
fmontes f3174a2
refactor: remove apps/ai-agents — agent code now lives in the scanner…
fmontes fb7d978
feat(a11y-agent): add Java proxy resource for streaming agent SSE (S4)
fmontes 3a3bf92
chore: remove unused agents-contract library
fmontes 5fe3888
fix(a11y-studio): inline agent contract types after removing agents-c…
fmontes 289c9d8
refactor(a11y-studio): simplify picker and run components
fmontes 33706d0
docs(rest): add typed @Schema descriptions to write-endpoint request …
fmontes 5c3b042
fix(rest): turn write-endpoint 500s into clean 400s
fmontes b0a7506
feat(mcp-server): add page_create tool
fmontes 365918f
fix(mcp-server): upload empty files as-is instead of skipping
fmontes cd9cab9
feat(mcp-server): raise execute tool sandbox timeout default to 45s
fmontes e5e2c6a
refactor(ai-ui): extract agent-agnostic message/streaming kernel
fmontes 73208be
feat(mcp-server): keep request/response schemas in generated spec wit…
fmontes d42f1fc
fix(mcp-server): harden authoring tools against recurring failures
fmontes 1656901
docs(rest): fix OpenAPI annotations for common authoring failures
fmontes 3f9c4bf
test: migrate branch specs to @openng/spectator after upstream rename
fmontes 1e1943c
test(page): update PageResourceTest for new host_id param on render/l…
fmontes 93afadd
fix(sdk-ai): don't break build when OpenAPI spec source is unreachable
github-actions[bot] 611c311
Point OpenAPI spec generation at the new headless environment
fmontes 4423656
Reorder imports alphabetically in ai-evals tools.ts
fmontes 802f894
build(ai-sdk): generate spec from local openapi.yaml only
fmontes b16f903
docs(openapi): document ContainerUUID.identifier accepted formats
fmontes 2061827
docs(openapi): clarify empty system-actions list is not a blocker
fmontes f99c20a
feat(contenttype): accept short base-type names for the clazz discrim…
fmontes a714776
feat(vtl): surface structured Velocity errors and warnings from /api/…
fmontes 82638ec
feat(mcp-server): add page_place_content tool
fmontes 9ae1420
fix(mcp-server): import DotCMSRuntime type directly, not via ReturnType
fmontes 1fd9321
fix(mcp-server): import DotCMSRuntime type directly in remaining tools
fmontes 02d17b9
remove plan
fmontes 93ba456
fix launch
fmontes bbdad3b
refactor(mcp-server): rename place-content lib to page-place-content
fmontes 682f584
refactor(mcp-server): prefix PlaceContent models with Page; fix stray…
fmontes 52bdbbb
feat(mcp-server): add page_verify render-verification tool
fmontes f93cdbc
fix(mcp-server): page_create root page on non-default site (Host.getI…
fmontes 4c48b07
fix(mcp-server): upload_assets include-glob matches nothing (brace/gl…
fmontes 9cfa5bd
feat(a11y-agent): agents shell + run-id stop, stream polish, done-rep…
fmontes 02ddb5b
feat(rest): accept short field-type clazz names + OpenAPI authoring f…
fmontes 027773b
feat(a11y-agent): heartbeat-driven "working" bubble in the activity log
fmontes f25f579
feat(a11y-agent): live fixing feedback — thinking indicator, live sco…
fmontes 87173c5
feat(a11y-agent): working-vs-live source file diff view
fmontes f524dc7
feat(a11y-agent): show containing folder path in diff file list
fmontes 43961e5
feat(a11y-agent): diff file list shows only name + line counts
fmontes e3b5b0f
fix(a11y-agent): move agent routes from /agent/a11y to /agents/a11y
fmontes bf050ab
refactor(a11y-agent): show file diff in a PrimeNG drawer, not a route
fmontes e1b51d5
fix(a11y-agent): keep diff drawer host out of the run screen grid
fmontes e117304
fix(a11y-agent): use position:fixed, not display:contents, for diff host
fmontes 71ff98b
fix(a11y-agent): show View file changes on any completed run
fmontes b2d0617
fix(a11y-agent): gate the whole p-drawer on open() to kill lingering …
fmontes a098405
fix(a11y-agent): append diff drawer to body so its mask sits below co…
fmontes b2de03a
feat(a11y-agent): widen diff drawer to 80vw for code comparison
fmontes 261e796
feat(a11y-agent): inline code diff with Preview/Code tabs, replacing …
fmontes 8080d70
feat(a11y-agent): Code tab always enabled, not just after a run
fmontes 1b40e40
feat(a11y-agent): enforce code review before publishing
fmontes 0fecbf9
feat(a11y-agent): send hostId at top level, relay agent errors verbatim
fmontes 9315126
feat(a11y-agent): changed-files accordion in side panel, diff in prev…
fmontes c655426
feat(a11y-agent): split side panel into scanner + files accordion panels
fmontes e72b789
refactor(a11y-agent): use PrimeNG accordion, move discard beside publish
fmontes f0de57e
feat(a11y-agent): publish/discard whenever files changed, not just af…
fmontes a0d0a48
refactor(a11y-agent): memoize axe derivations, drop template method c…
fmontes cd54ebd
refactor(a11y-agent): slim the studio store's public surface
fmontes 2899213
refactor(a11y-agent): split the studio store into picker + run stores
fmontes 445c2a7
fix(a11y-agent): wrap long needs-review text instead of truncating
fmontes 5d956a6
fix(a11y-agent): reload the run screen when the site selector changes
fmontes a052f2d
style(a11y-agent): align side-panel accordion with PrimeNG defaults
fmontes 15c1439
refactor(a11y-agent): move skip-CSS to the fix step, default the pane…
fmontes 1789765
fix(a11y-agent): scroll the accordion CONTENT, cap the files panel at…
fmontes 8ed65ba
fix(a11y-agent): add a divider between the scanner and files panels
fmontes ec8925a
refactor(a11y-agent): default the remaining side-panel fonts
fmontes d92395f
fix(a11y-agent): stop the page scrolling when the files panel is coll…
fmontes e4d93de
Fix format
fmontes 2c5b061
refactor(a11y-agent): extract diff-viewer template to html file
fmontes 46715b5
delete plans
fmontes e639ba0
Merge branch 'main' of https://github.com/dotCMS/core into fmontes/do…
fmontes 9996d84
Merge branch 'fmontes/dotcms-openapi-authoring-fixes' of https://gith…
fmontes ca7917d
fix(a11y-agent): treat reported rows as pass-1 handoff, derive counts…
fmontes 88a6d60
docs(architecture): seed primitives.yaml for the AI agent platform
fmontes a2c6bfc
Merge branch 'main' of https://github.com/dotCMS/core into fmontes/do…
fmontes 043af7b
Fix format
fmontes ed0702a
refactor(a11y-agent): address PR review feedback
fmontes b5f031c
docs(a11y-agent): document the /dot-page proxy as a backend gap
fmontes e02235f
Fix format
fmontes b142e43
fix(a11y-agent): prefix upstream Page Scanner calls with /v1
fmontes 535e2f6
fix(a11y-agent): address blocking PR review findings
fmontes ba8f66a
fix(a11y-agent): address PR review findings in stores, services and d…
fmontes 09ee788
fix(a11y-agent): address PR review findings in the frontend UI layer
fmontes ecb9c9c
chore(a11y-agent): drop the seed architecture primitives map
fmontes 055c263
fix(mcp-server): make tool errors actionable and bound the unbounded
fmontes 6e426a1
fix(mcp-server): harden multi-site page tooling
fmontes cf139e1
fix(mcp-server,sdk-ai): normalize page paths and bound sandbox serial…
fmontes b73ce4b
fix(rest): apply PR review on a11y agent forms and template errors
fmontes e4490d6
refactor(a11y-agent): apply the repo's Angular and TypeScript convent…
fmontes 85a20ea
refactor(a11y-agent,mcp-server): remove duplicated types and share th…
fmontes 99b5460
fix(rest): document, test and harden the a11y agent proxy
fmontes f713b96
fix(a11y-agent): import missing ESContent type in page list store
fmontes 69765a5
refactor(rest): let the a11y agent own run identity
fmontes 57427fb
test(data-access): cover the agent stream's abort and failure paths
fmontes d636405
test(mcp-server): cover the asset transfer paths that had none
fmontes 353d22d
test(dot-agents): pin the page math, the marker calls and the mid-fix…
fmontes d504e6e
test(ai-ui): select agent bubbles by testid, not by icon font or class
fmontes fca47c7
docs: drop plan-section references from the a11y agent code
fmontes 4c829c7
refactor(dot-agents): hold the a11y run screen's view state in one si…
fmontes 9903b90
refactor(dot-agents): extract the a11y preview pane from the run screen
fmontes 6c015cf
refactor(dot-agents): extract the a11y score widget from the run screen
fmontes f79a978
refactor(dot-agents): extract the a11y activity log from the run screen
fmontes 55e0177
refactor(dot-agents): extract the a11y action footer from the run screen
fmontes dccb877
test(dot-agents): point the a11y run spec at the shell's own job
fmontes 2f89f37
refactor(ui): swap this PR's PrimeIcons for Material Symbols
fmontes a72c59e
fix(dot-agents): import A11yGroup from the lib that exports it
fmontes a70d5b8
refactor(dot-agents): use dot-color-icon for the a11y footer chip
fmontes e371d1c
fix(ai-ui): judge the activity log's scroll pin before the render gro…
fmontes 854038f
chore(ai-ui): drop the unused eslint-disable from the jest config
fmontes 42d6649
fix format
fmontes 770ca7e
Merge remote-tracking branch 'origin/main' into fmontes/dotcms-openap…
fmontes 5eb91a6
fix(test): pass the new hostId arg in the Time Machine loadJson calls…
fmontes File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,6 @@ | ||
| .env | ||
| /libs/agentic-tools/src/generated | ||
|
|
||
| vite.config.*.timestamp* | ||
| vitest.config.*.timestamp* | ||
| vitest.config.*.timestamp* | ||
|
|
||
| .angular |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.