Tags: SISL-UIC/hoop
Tags
EVL-105: fix shell navigation and gating drift found by the migration… … audit (hoophq#1641) * EVL-105: fix shell navigation and gating drift found by the migration audit - CommandPalette: remove dead Quick Access "Reviews" (/reviews has no route on either side) and the dead "Test Connection" action (navigated to /connections/<name>/test which never existed; testing lives in the TestConnectionModal of /roles/:name/configure) - CommandPalette: apply the same adminOnly/selfhostedOnly gating as the Sidebar (shared shouldHide helper) — admin pages no longer show up for non-admin users, Infrastructure/Authentication respect selfhosted - Sidebar: restore selfhosted-only gating on Integrations > Authentication (parity with the CLJS sidebar) and make isActive query-aware so Integrations > Jira (/jira-templates?tab=configuration) can highlight - Router: redirect /plugins/manage/jira -> /jira-templates?tab=configuration; the CLJS bidi route survived its panel deletion and rendered an infinite spinner for old bookmarks - CLJS attributes: navigate to /settings/attributes/edit/<name> (path param) instead of ?name=<name> so the URL matches the React route instead of falling through the catch-all into the superseded CLJS panel; bidi route parametrized and the panel reads the route param for pure-CLJS dev parity Not included: the audit's "Router doesn't enforce experimental.rulepacks" finding turned out to be a non-issue — both Rulepacks pages already gate themselves with FeatureFlagGate (loader + redirect). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-105: decode the attribute-name route param in the CLJS edit panel bidi/match-route returns the raw (percent-encoded) path segment, so names with spaces would reach :attributes/get encoded in pure-CLJS dev mode. Reuse the existing safe-decode-uri-component helper (same pattern as the workflow-details panel). Addresses the URL-charset verification item from the Qodo review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
EVL-98: Config Status checklist widget + light sidebar (webapp_v2) (h… …oophq#1642) * EVL-98: add Config Status checklist widget and recolor sidebar to light theme Sidebar moves from dark navy to the light gray scale (new Mantine gray/indigo ramps), completing the semantic token wiring in cssVariablesResolver (text/dimmed/placeholder → Radix slate) and renaming --sidebar-bg to --brand-navy for the auth/upsell surfaces that keep the navy look. Adds an admin-only Config Status widget at the top of the expanded sidebar: a 3-step setup checklist (Connect a resource, Set up access, Tune Features) with ring progress, computed client-side from real configuration state (agents, connections, sessions, groups, guardrails, masking rules, AI session analyzer provider, protection profile). The widget hides at 3/3, opens one step at a time, collapses on outside interaction, and deep-links each sub-item ("Run your first session" preselects an exec-capable connection in the web terminal via ?role=, falling back to the native client access modal). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: keep Config Status open across navigation and adjust done icons Product feedback: the widget now stays expanded until the admin closes it via the header chevron (no more collapse on outside interaction or after navigating from a sub-item). Done icons change to lucide BadgeCheck (sub-items) and CircleCheckBig (step headers), and the ring percentage label gets breathing room. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: restore ring label size and shrink completed-step check glyph The 8px label was an unrequested change — back to 9px, keeping the 2px breathing padding. The step-done CircleCheckBig renders at 20px inside the same 24px slot so titles stay aligned. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: restore Figma collapse behavior for the Config Status widget Back to the annotated design behavior: the widget collapses when the user interacts outside it and after navigating from a sub-item. The icon adjustments from the previous feedback round are kept. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: collapsed rail uses symbol-only logo and Discover sorts alphabetically Matches the sidebar component in Figma (Components | Custom): the 72px collapsed rail shows just the hoop symbol (the symbol+text asset overflowed and got clipped), and the Discover section follows the design's alphabetical order (Event Routing and Rulepacks, absent from the design, slot in alphabetically). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: step icons get action-button styling; keep padding tweaks Step-group icons render inside a non-interactive ActionIcon-styled container (component="div" — the click stays on the whole row): gray light for pending, green light when the step completes. Includes the spacing adjustments made during design review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: step action-button container at 24px Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: update padding and gap variables in ConfigStatus styles * fix: update body text color in theme and improve ActionIcon styling in StepItem component * refac: improve colors to adapt to primary shade as 5 * reorganiza components colors and sizes to match hoop figma standards * fix: update padding in ConfigStatus styles and adjust ActionIcon properties in StepItem component for improved consistency * EVL-98: upgrade lucide-react to 1.27.0 for ShieldCogCorner "Set Protection Level" now uses the exact shield-cog-corner glyph from the Figma design. All 70 lucide icons imported across the app verified present in 1.27.0 (no renames from the 0.577 ramp affect us). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: Set Protection Level shows ShieldCheck when done Sub-items accept a per-item doneIcon (default stays BadgeCheck). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: Config Status reacts to completed steps without reopening The snapshot now refreshes on window focus and on a 30s background poll (10s while the widget is expanded), with the fetch TTL down to 15s so navigation triggers feel live. Polling self-terminates once setup hits 3/3 — the widget unmounts its render and the tick guard stops fetching, so configured orgs never poll. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: instant checklist reaction when the first query runs The CLJS web terminal emits a hoop:session-executed CustomEvent on exec success; the Config Status widget listens and force-refreshes, so the step-defining "Run your first session" checks off the moment the query finishes. Other checks keep the focus/poll refresh. Contract documented in CONTEXT_MIGRATION.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: fix CLJS enterprise banner broken by the --sidebar-bg rename The activation-journey banner (terminal pre-execution and feature pages) referenced --sidebar-bg, which this branch renamed to --brand-navy — the banner went white. It now uses var(--brand-navy, #1F2D5C) with a literal fallback, and the token value is corrected to the brand blue #1F2D5C on the React side (MethodCard, SelectionCard, EnterpriseBanner and AuthPageLoader follow automatically). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: flat variant for the terminal enterprise banner The activation-journey banner glued under the terminal tabs loses its border radius via a new :flat? prop (Figma: Product activation journey, node 2219-49075). Standalone placements (feature-page headers, See Features modal) keep the rounded card. The banner remains a conditionally rendered, self-contained sibling of the tabs row, so when it goes away (enterprise license / dismissed) the tabs sit directly on the logs with zero leftover styling. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Update tab item text size and refactor output tabs structure for improved layout consistency * EVL-98: address Qodo review — per-user snapshot baseline and gentler open poll When the authenticated user changes, fetchStatus now rebuilds checks from the initial baseline and drops the previous user's connection names, so partially failed probe runs can no longer leak user A's snapshot stamped as user B. The expanded-widget poll becomes TTL-respecting (no more forced probe burst every 10s). Ticket-prefix comment format applied. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: nav icons at 16px with 8px icon-label gap per Figma component Measured on the Menu Item (State=Default, Color=White) component in Components | Custom: 16x16 icon slot and gap-[8px] between icon and label. Expanded sidebar only — the collapsed rail keeps its icon size. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: nav icons at 18px as specced The 18x18 size from the design review was the expected spec; the 16px component instance measurement should not have overridden it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: collapsed rail icons match the expanded nav size (18px) The Menu-Only Icon component (gray sidebar, collapsed) uses the same icon slot as the expanded Menu-OrgItem — open and closed states share one icon size. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-98: drop the icon-label gap override, back to the default spacing The tightened section gap added during review didn't match the intended design — Mantine's default NavLink section spacing is the reference. Nav icons stay at 18px. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: mtmr0x <github@mat-m.com>
feat: license feature flag (hoophq#1631) * feat: add features field to LicensePayload and related structures * feat: implement license feature gating across various components and routes * chore: regenerate OpenAPI docs * chore: regenerate OpenAPI docs * refactor: update license feature handling to ensure empty lists indicate all features are enabled --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
feat: feature support static oauth client registration for mcp (hooph… …q#1646) * DEP-80: static OAuth client registration for MCP auth IdPs without RFC 7591 DCR support (JumpCloud, Okta, Entra ID) cannot complete the MCP OAuth flow: clients abort at discovery with no registration_endpoint, and tokens minted for a static client carry aud=client_id, failing the RFC 8707 audience check. - add client_id/client_secret to PUT /api/serverconfig/mcp-auth and hoop admin mcp auth enable/configure (--client-id, --client-secret) - when a static client is set, advertise the gateway as authorization server (RFC 9728), mirror the IdP's RFC 8414 metadata, and serve an RFC 7591 shim that hands out the pre-registered client - accept the static client_id as alternate audience during token validation; public client + PKCE recommended since the shim is unauthenticated Refs hoophq#1645 * DEP-80: canonical URI audience comparison for MCP tokens Byte-exact aud matching rejected tokens minted for the correct resource when the configured resource_uri differed cosmetically (trailing slash, host case, explicit default port, e.g. a token carrying https://demo.hoop.dev/api/mcp against a configured value with a trailing slash). - compare URI-shaped audiences in canonical RFC 3986 form; opaque client IDs remain exact and case-sensitive - include got/want audiences in the mismatch error - fix documented resource_uri default: <API_URL>/api/mcp, not <API_URL>/mcp * feat(oidc): enhance token validation to support static OAuth client IDs * refactor: enhance audience claim handling and canonical resource URI processing
EVL-101: Migrate Slack and Webhooks plugin pages to webapp_v2 (hoophq… …#1633) * chore: add team Claude Code setup (.claude package + MCP servers) - .claude/: shared settings (permissions, hooks, gofmt-on-edit), fix-ticket and test-plan skills, team README with the worktree flow - .mcp.json: Linear + Figma MCP servers (root file un-ignored) - CLAUDE.md: Team AI Workflow section - .gitignore: version .claude/ selectively (worktrees and local settings stay ignored) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-101: migrate Slack and Webhooks plugin pages to webapp_v2, remove legacy plugins route - New React pages at /integrations/slack and /integrations/webhooks (admin-only), backed by services/plugins.js and a shared usePlugin hook - Slack: Connections tab (per-connection toggles + channel IDs modal) and Configurations tab (tokens base64-encoded on save, decoded for display) - Webhooks: per-connection enable/disable toggle list - Fresh org (GET /plugins/:name 404): first save/toggle creates the plugin via POST /plugins - Repoint webapp_v2 sidebar away from /plugins/manage/* - Remove legacy :manage-plugin route, :manage-plugin-panel, slack/webhooks sidebar entries and the dead plugin views/events from the CLJS app Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-101: use v1 snackbar (top-right) and full-height centered loaders Review follow-ups: - Port the v1 snackbar from feat/ai-agents: showSnackbar helper backed by sonner + components/Snackbar/Toast (1:1 with the legacy CLJS toast), Toaster mounted top-right in App.jsx; new pages migrated off @mantine/notifications - Document the rule in webapp_v2/CLAUDE.md and COMPONENTS.md: never use @mantine/notifications; migrate notifications.show() to showSnackbar whenever touched - Center page loaders: single full-height PageLoader per page; the connections fetch moved into usePlugin so PluginConnectionsList is purely presentational Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-101: address Qodo review — legacy URL redirects, nil-route guard, connections shape - Redirect /plugins/manage/{slack,webhooks} to /integrations/* in the React router (same pattern main used for /settings/jira) so old bookmarks keep working - Guard window.hoopSetRoute against unknown paths: routes/parse returns nil for unmatched routes and (name nil) threw in the React-shell bridge — latent for any unknown URL, now falls back to :home - Normalize /connections response shape in usePlugin ({items} or array), matching the EventRouting store Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
EVL-101: Migrate Slack and Webhooks plugin pages to webapp_v2 (hoophq… …#1633) * chore: add team Claude Code setup (.claude package + MCP servers) - .claude/: shared settings (permissions, hooks, gofmt-on-edit), fix-ticket and test-plan skills, team README with the worktree flow - .mcp.json: Linear + Figma MCP servers (root file un-ignored) - CLAUDE.md: Team AI Workflow section - .gitignore: version .claude/ selectively (worktrees and local settings stay ignored) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-101: migrate Slack and Webhooks plugin pages to webapp_v2, remove legacy plugins route - New React pages at /integrations/slack and /integrations/webhooks (admin-only), backed by services/plugins.js and a shared usePlugin hook - Slack: Connections tab (per-connection toggles + channel IDs modal) and Configurations tab (tokens base64-encoded on save, decoded for display) - Webhooks: per-connection enable/disable toggle list - Fresh org (GET /plugins/:name 404): first save/toggle creates the plugin via POST /plugins - Repoint webapp_v2 sidebar away from /plugins/manage/* - Remove legacy :manage-plugin route, :manage-plugin-panel, slack/webhooks sidebar entries and the dead plugin views/events from the CLJS app Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-101: use v1 snackbar (top-right) and full-height centered loaders Review follow-ups: - Port the v1 snackbar from feat/ai-agents: showSnackbar helper backed by sonner + components/Snackbar/Toast (1:1 with the legacy CLJS toast), Toaster mounted top-right in App.jsx; new pages migrated off @mantine/notifications - Document the rule in webapp_v2/CLAUDE.md and COMPONENTS.md: never use @mantine/notifications; migrate notifications.show() to showSnackbar whenever touched - Center page loaders: single full-height PageLoader per page; the connections fetch moved into usePlugin so PluginConnectionsList is purely presentational Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-101: address Qodo review — legacy URL redirects, nil-route guard, connections shape - Redirect /plugins/manage/{slack,webhooks} to /integrations/* in the React router (same pattern main used for /settings/jira) so old bookmarks keep working - Guard window.hoopSetRoute against unknown paths: routes/parse returns nil for unmatched routes and (name nil) threw in the React-shell bridge — latent for any unknown URL, now falls back to :home - Normalize /connections response shape in usePlugin ({items} or array), matching the EventRouting store Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
feat(mssql): native guardrails support (hoophq#1630) * feat(mssql): native guardrails support (flag-gated) Enforce guardrails on native MSSQL (TDS) protocol sessions, which were previously refused fail-closed because the proxy could not evaluate rules. Behind the new beta.mssql_native_guardrails feature flag (default on): - gateway: sessionSupportsGuardRails allows a guarded native MSSQL session when the org's flag is on, and keeps refusing it when off. - agent: processMSSQLProtocol forwards the connection's guardrail rules to the libhoop MSSQL proxy (which validates SQLBatch and RPC sp_executesql/prepare/prepexec statements and blocks violations). The flag defaults on; enforcement lives in the agent proxy, so agents must be upgraded alongside the gateway (older agents run the session unguarded) — documented on the flag and in the gateway comment. Output data masking for MSSQL remains out of scope (follow-up). Adds an integration test that blocks and allows queries against a real SQL Server for both the SQLBatch and sp_executesql paths, and updates the guardrails gate unit tests to be flag-aware. Requires the paired libhoop change (hoophq/libhoop#96). Closes DEP-69 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * fix(mssql): refuse native sessions with output guardrail rules (review) Native MSSQL enforces input guardrails only (result-set masking is not yet implemented). Admitting a connection whose rules include output rules would run them silently unenforced, so refuse it fail-closed at session open. Web Exec, which enforces output rules via the db-exec redactor, is exempt. Adds an e2e test proving the dynamic-exec parameter bypass is blocked against a real SQL Server, and a unit test for the output-rule detector. Part of DEP-69. 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * fix(mssql): remove agent flag race, persist mid-session guardrail info (review) Second round of review fixes: - agent: stop re-checking beta.mssql_native_guardrails on the agent before forwarding rules. The gateway is the sole admission authority (it only opens the session when the org flag is on and refuses output-ruled connections), so the agent now always forwards the rules it was sent. This removes a feature-flag sync race that could open an unguarded proxy if the agent had not yet received the flag update. - gateway: persist guardrail violation metadata from native protocol error replies (MSSQL and PG connection writes), not only on SessionClose. A native guardrail block keeps the session open, so the matched-rule info was previously discarded. UpdateSessionGuardRailsInfo appends, so violations accumulate on the session record. Part of DEP-69. 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * test(mssql): gateway integration test for output-rule admission refusal (review) Add a gateway integration test proving a native MSSQL session on a connection with output guardrail rules is refused fail-closed (the TDS proxy enforces input rules only). Adds postMSSQLConnection and createOutputGuardrailForConnection harness helpers. Part of DEP-69. 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * feat(mssql): gate native guardrails on agent capability (fail-closed rollout) Close the mixed-version fail-open: enforcement of native MSSQL guardrails lives in the agent, so the gateway must not admit a guarded native MSSQL session to an agent that cannot enforce it. - The agent now advertises its capabilities in the gRPC connect metadata (agent-capabilities), including mssql_native_guardrails. - The gateway resolves the selected agent's stream at admission and refuses the session fail-closed unless it advertises the capability. An older agent omits it and is refused, never run unguarded — so beta.mssql_native_guardrails can safely default on across a rolling upgrade. Reuses the existing gRPC agent metadata channel and agent-stream registry (the prior capability mechanism was websocket/agentrs-only, for RDP, and did not cover the Go gRPC agent that runs the MSSQL proxy). Adds a gateway integration test that a guarded native MSSQL session is refused when the agent does not advertise the capability, and unit tests for the capability list/parser. Part of DEP-69. 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * fix(mssql): advertise guardrails capability only when libhoop enforces it The agent previously advertised mssql_native_guardrails unconditionally, so a build linked against the OSS/noop libhoop (or a libhoop whose MSSQL proxy is a passthrough) would falsely claim support and the gateway would admit a session it cannot enforce. - Derive the advertised capability from the linked libhoop (libhoop.SupportsMSSQLGuardRails): the noop build returns false, so such an agent advertises nothing and the gateway keeps the session fail-closed. - Move capability-list construction from common/proto into the agent (which links libhoop); common/proto keeps only the token constants and the parser. - Document the fail-closed behaviors (dynamic execution, unsupported parameter types, output rules) on the feature flag. Part of DEP-69. 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * test(mssql): cover capable-agent admission and old-agent refusal (review) Add a positive gateway integration test that a native MSSQL guarded session on a capability-advertising agent passes admission (guards against a routing or metadata regression silently failing every guarded session closed), and switch the fail-closed test to a capability-less agent starter. The harness DialAgent now advertises the native MSSQL guardrails capability (faithful to a current agent linked against the enforcing libhoop); dialAgentWithoutCapabilities stands in for an older agent. Part of DEP-69. 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * test(mssql): use the real gateway guardrail JSON shape in e2e (qodo) The MSSQL integration fixture injected guardrail rules as an array of {id,name,input_rules,output_rules} objects, but the gateway ships a single object with top-level input_rules/output_rules (see encodeGuardRailRules). Use that exact shape so the e2e exercises the real gateway->agent payload. Part of DEP-69. 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * refactor(mssql): drop native guardrails flag, scope PG audit revert Address maintainer review on hoophq#1620: - Remove the beta.mssql_native_guardrails feature flag entirely. Native MSSQL guardrails are now driven purely by whether the connection has guardrail rules configured, exactly like Postgres/MySQL. libhoop stays the sole authority: it enforces input rules and fails closed at proxy construction for anything it cannot evaluate. Drops the flag catalog entry, the dropNativeMSSQLGuardRails gate and its unit test, and flag-referencing docs. - Revert the PGConnectionWrite audit change back to origin/main (error-message rewrite only); keep violation-metadata persistence on the new MSSQLConnectionWrite case, where it is needed because a native MSSQL block keeps the session open rather than carrying the info on SessionClose. DEP-69. 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * fix(mssql): ship only configured guardrail rules Drop empty direction placeholders before forwarding guardrails and remove unrelated protocol residue. Fixes #DEP-69 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * test(mssql): add JDBC guardrail integration Exercise the production TCP client proxy with Microsoft JDBC metadata, query, and post-block traffic. Generate the pinned driver classpath in CI and isolate test transport packets across serialization boundaries. Fixes #DEP-69 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * fix(mssql): skip empty guardrail metadata Avoid database writes when decoded guardrail metadata contains no violations. Fixes #DEP-69 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * ci: pin paired libhoop revision Resolve same-named libhoop branches once so integration jobs test one exact commit and only missing branches fall back. Fixes #DEP-69 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * ci: block unmerged paired dependencies Keep paired libhoop integration coverage while exposing a separate exact-commit merge gate for safe cross-repository merge ordering. Fixes #DEP-69 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> * test(mssql): isolate listener address lookup Fixes #DEP-69 🤖 Generated with Mister Maluco Co-Authored-By: MisterMal <teskeslab@lucasteske.dev> --------- Co-authored-by: MisterMal <teskeslab@lucasteske.dev>
[DEP-77] add the default valeu to the analyzer and some libhoop chang… …es (hoophq#1644) * fix default value on frotend * fix(webapp): block data masking edit form on failed rule fetch to prevent overwriting rule with defaults
EVL-104: unify webapp_v2 snackbars on showSnackbar, remove @mantine/n… …otifications (hoophq#1638) * EVL-104: unify webapp_v2 snackbars on showSnackbar, remove @mantine/notifications webapp_v2 had two toast systems running at once: the sonner-based showSnackbar (migrated from the CLJS app, top-right, v1 visual) and Mantine @mantine/notifications (bottom-right, different visual). - Migrate all 33 notifications.show() call sites (10 files) to showSnackbar - Switch Roles/Configure from the CLJS-bridge snackbar to the local showSnackbar (the CLJS Toaster is unmounted on React-only routes, so bridged toasts could be silently lost) and drop the bridge method - Remove the <Notifications /> provider, its styles import, and the @mantine/notifications dependency - Update CLAUDE.md, COMPONENTS.md and CONTEXT_MIGRATION.md accordingly Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-104: fix import grouping in CommandPalette (@/ before relative) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
EVL-102: Migrate Jira integration to a Jira Templates setup page in w… …ebapp_v2 (hoophq#1634) * chore: add team Claude Code setup (.claude package + MCP servers) - .claude/: shared settings (permissions, hooks, gofmt-on-edit), fix-ticket and test-plan skills, team README with the worktree flow - .mcp.json: Linear + Figma MCP servers (root file un-ignored) - CLAUDE.md: Team AI Workflow section - .gitignore: version .claude/ selectively (worktrees and local settings stay ignored) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-102: add Jira Templates service, store and helpers in webapp_v2 Extends the list-only jiraTemplates service with template CRUD, org integration get/create/update and the Jira Assets object search. Adds a page-local zustand store (DataMasking status-enum pattern) and the form helpers ported from the legacy CLJS implementation, minus its payload leaks (selected/timestamp UI keys no longer reach the API). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-102: add Jira Templates page with Templates and Configuration tabs Runbooks-Setup-style layout: header + tabs, synced with ?tab= so the sidebar can deep-link the Configuration tab. Templates tab covers the integration-not-configured promotion gate, empty state, list with delete confirmation and free-plan limit banner. Configuration tab absorbs the legacy /settings/jira form (POST on first save, PUT after). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-102: add Jira template create/edit form and routes Mirrors the legacy form sections: basic info, workflow transition (including skip_transition_on_nonzero_exit_code, which the legacy UI stored but the form now exposes as a switch), resource-role multi-select, preset/custom mapping tables sharing one rules array, manual prompts and CMDB rules. CMDB Value becomes a searchable asset picker (GET /integrations/jira/assets/objects) once the row has an Object Type ID, storing the object name; it degrades to plain text on lookup errors. Routes registered above the /* catch-all. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-102: point sidebar and command palette at the React Jira page Integrations > Jira now deep-links /jira-templates?tab=configuration; adds a Jira Templates quick-access entry to the command palette. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-102: remove legacy Jira templates and Jira settings CLJS pages Deletes the four panels (:jira-templates-panel, :create-jira-template- panel, :edit-jira-template-panel, :settings-jira-panel), their bidi routes, the admin-surface views under jira_templates/ and integrations/jira/, the sidebar entries and the jira-templates promotion. Prunes the now-orphaned admin CRUD events (create/update/ delete/get-by-id, active-template subs, selected-connections hydration) whose success handlers navigated to the removed bidi route. Keeps every runtime consumer intact: prompt_form, loading modal, cmdb_error, submit-template/CMDB events, jira-integration->get and the :jira-templates->list sub used by webclient and configure-role. The configure-role "Go to JIRA Integration" callout now links the React route directly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-102: update migration docs for the Jira pages Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-102: show the feature promotion before the tabbed page When the org has no Jira integration, the full-page promotion now replaces the header + tabs entirely (FullBleed), matching how other features gate (e.g. Live Data Masking) — instead of rendering inside the Templates tab. Its primary action and the sidebar deep-link open the page directly on the Configuration tab. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * EVL-102: address review — drop session.verb, persist promotion, redirect /settings/jira - Remove session.verb from the preset mapping options: the gateway's loadDefaultPresetFields never resolves it, so templates saved with it failed Jira issue creation at runtime (Qodo finding). - Persist the promotion gate in localStorage (jira-templates-promotion-seen), mirroring the legacy Runbooks Setup behavior: after the primary action is clicked once the promotion no longer replaces the page. - Once the promotion is dismissed and the integration is still missing, the Templates tab shows an empty state with a Configure Jira Integration CTA (review suggestion) instead of the promotion. - Redirect the absorbed /settings/jira URL to /jira-templates?tab=configuration so old bookmarks keep working (Qodo finding). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
PreviousNext