Commit Graph

184 Commits

Author SHA1 Message Date
Sacha Al Himdani
ef2e99d86c Add measure-document linking
Introduce the ability to link measures to documents, following the
existing pattern used by controls and risks. This includes:

- Database migration for measures_documents join table
- Coredata MeasureDocument struct with insert/delete operations
- Document service methods for listing/counting by measure ID
- Measure service CreateDocumentMapping/DeleteDocumentMapping methods
- Cleanup of measure-document mappings on document archive
- GraphQL mutations, inputs, payloads, and Measure.documents field
- DocumentConnection.TotalCount support for measure resolver
- MCP linkMeasure/unlinkMeasure updated to support documents
- MCP listMeasureDocuments tool
- Frontend MeasureDocumentsTab with LinkedDocumentsCard integration
- Authorization actions for measure document mapping
- E2e tests for measure document mapping

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-03 17:51:31 +02:00
Sacha Al Himdani
851e585b9b Add ISC license headers to Go, TypeScript, and SQL files
Add ISC license headers to all .go, .ts, .tsx, and .sql files
using each file's git history to determine the correct copyright
year or year range. Trademarked icons (brand logos, vendor logos,
compliance framework logos) are excluded.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-31 13:31:30 +02:00
Sacha Al Himdani
4a2d308da0 Add task drag-and-drop reordering
Order tasks by priority (ASC) by default. Enable drag-and-drop
on the TODO and DONE tabs using native HTML5 drag events,
following the compliance external URLs pattern. The "All" tab
remains read-only since priority is scoped per state.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 15:47:12 +01:00
Bryan Frimin
619ec7b882 Add AI-powered evidence description generation
Introduce a background worker that automatically generates
compliance-focused descriptions for uploaded evidence files
using configurable LLM providers. Descriptions are surfaced
across all interfaces: GraphQL API, MCP API, CLI, and the
console UI.

Key changes:
- Multi-provider LLM config with per-agent settings (pointer
  types for Temperature/MaxTokens to preserve zero values)
- Evidence description worker with bounded concurrency
- EvidenceDescriptionStatus typed enum with PostgreSQL enum type
- New `prb evidence` CLI commands (list, view, delete)
- Evidence description displayed in console table and preview
- Migration only marks evidences without files as completed

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 14:32:41 +01:00
Bryan Frimin
359f85f5da Add SEO controls and sitemap for compliance pages
Add search engine indexing toggle, robots.txt, and sitemap.xml
generation for compliance pages. Replace checkboxes with toggle
components in the compliance page UI and add an "Open" button
in the page header to quickly access the live compliance page.
The search engine indexing toggle is disabled when the compliance
page is inactive.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-24 15:55:31 +01:00
Bryan Frimin
a9ebeef0fa Transform meetings page into context page with tabs
Add structured organization context with 5 markdown sections (Product, Architecture, Team, Processes, Customers) editable inline. Meetings are now a tab within the context page. Moved all GraphQL queries from hooks/graph/MeetingGraph.ts into colocated components following new best practices. Updated database schema, backend services, GraphQL resolvers, and MCP API to support the new context fields and structure.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 19:02:50 +01:00
Sacha Al Himdani
1db8e7133e Add document archiving
Documents can be archived and unarchived. Archived documents are
read-only, excluded from the trust center, and moved to a dedicated
Archived tab in the document list.

- Add archived_at timestamp and status (ACTIVE/ARCHIVED) PG enum column
- Rename DocumentStatus → DocumentVersionStatus, introduce DocumentStatus
- Archive/unarchive mutations in GraphQL, MCP, and CLI
- Bulk archive/unarchive mutations with Active/Archived tabs in the list
- ABAC policies: write actions denied on archived docs, unarchive denied
  on active docs
- Remove control/risk mappings and reset trust center visibility on archive
- Exclude archived documents from mapping dialogs and trust center tab

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-19 14:15:54 +01:00
Bryan Frimin
82f241628c Refactor MeasuresPage to use Relay fragments
Replace the client-side grouped-by-category view (fetching 500 items)
with a flat table using server-side filtering and cursor-based
pagination. Colocate GraphQL queries, fragments, and mutations in the
component file per console CLAUDE.md conventions.

Backend changes add a category filter to the measure list endpoints
(GraphQL, MCP) and a new measureCategories field on Organization.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 09:54:33 +01:00
Bryan Frimin
32cc4a4f9c WIP
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 09:39:39 +01:00
Bryan Frimin
0e0539f1f3 Replace console frontend with unified findings pages
Add FindingsPage, FindingDetailsPage, and CreateFindingDialog
supporting all finding kinds (nonconformity, observation, exception)
with filtering, sorting, and audit linking.

Remove the separate nonconformity and continual improvement pages,
routes, and graph hooks. Update sidebar navigation, routes, and
components for nullable audit framework field.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-17 15:05:33 +01:00
Sacha Al Himdani
cf1dadc0b5 Add implemented state and justification to controls
Introduce `implemented` enum (IMPLEMENTED/NOT_IMPLEMENTED) and
`not_implemented_justification` (nullable text) fields on the Control
entity across all API surfaces (GraphQL, MCP, CLI), database, frontend,
and SOA export.

The database stores implementation state as a PostgreSQL enum
`control_implementation_state`. Controls default to IMPLEMENTED during
migration. The SOA list and PDF export show implementation status
alongside applicability, with "-" for non-applicable controls.
Justification columns are renamed for clarity: "Justification for
non-applicability" and "Justification for non-implementation".

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-17 11:01:04 +01:00
Bryan Frimin
ecba352307 Revert relay generics that cause cascade type errors
Adding TypeScript generics to useMutation, usePaginationFragment,
and useRefetchableFragment in graph hooks and page files causes
cascade type mismatches: string values are not assignable to
generated enum types, and typed refetch functions are incompatible
with SortableTable's generic refetch prop.

Use eslint-disable-next-line relay/generated-typescript-types
instead until the calling code is updated to use enum types.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 13:45:23 +01:00
Bryan Frimin
d263cda3f6 Add eslint-disable and TypeScript generics to graph hooks
Centralized graph files (hooks/graph/*.ts) define GraphQL
queries consumed by multiple page components. This architecture
intentionally separates field definitions from usage, triggering
relay/unused-fields and relay/must-colocate-fragment-spreads.
File-level eslint-disable comments suppress these false positives.

Also adds explicit TypeScript generics to useMutation and
usePaginationFragment calls to satisfy relay/generated-typescript-types
without eslint-disable.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 13:32:18 +01:00
Sacha Al Himdani
c493e31745 Fix documents UI
- Fix redirection after document deletion in detail page
- Fix refetch after publication
- Return proper error when trying to update a published document

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-13 12:01:57 +01:00
Bryan Frimin
79084bca23 Refactor compliange page access code
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-23 09:38:28 +01:00
Bryan Frimin
069b47d240 Add NDA view on console
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-23 09:38:28 +01:00
Sacha Al Himdani
40e4db9278 Remove deprecated SOA code
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-17 15:06:49 +01:00
Émile Ré
6b4185aa9b Make console buildable by removing people related GQL queries
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-12 16:21:10 +04:00
Bryan Frimin
5f7d4689aa Simplify UX of compliance access management
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-10 12:00:27 +01:00
Sacha Al Himdani
4f6884cb8f Fix duplicate assessments
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-09 14:23:01 +01:00
Émile Ré
3d14a592f6 Fix control obligation mapping action names
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-06 16:28:39 +04:00
Émile Ré
73ec5ce96b Rename trust center to compliance page in displayed text
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-29 08:41:18 +04:00
Émile Ré
ee3b0728bc Remove legacy trust center page
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-28 21:50:44 +04:00
Émile Ré
7e92d5a165 Refactor compliance page access page
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-28 21:45:43 +04:00
Émile Ré
42557e1640 Refactor compliance page vendors
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-28 19:17:27 +04:00
Émile Ré
c74631ae54 Refactor compliance page files page
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-28 18:37:44 +04:00
Émile Ré
36a936fcf4 Refactor compliance page documents page
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-28 16:52:17 +04:00
Émile Ré
3e3c3a8ebb Refactor compliance page audits page
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-28 16:17:45 +04:00
Émile Ré
07ea130536 Remove unused files
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-28 15:25:42 +04:00
Émile Ré
fb09bed247 Refactor document detail to document layout
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-27 17:52:58 +04:00
Émile Ré
3f96869b6b Refactor documents page
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-27 17:52:58 +04:00
Émile Ré
e143477d66 Remove extensions from import paths
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-23 12:42:34 +04:00
Bryan Frimin
4bdf941d3a Refactor SOA
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-22 10:20:50 -08:00
Émile Ré
3b4f77c5e8 Change folder aliases
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-22 21:14:37 +04:00
Émile Ré
c168be6de0 Add import order sorting rules
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-22 20:38:37 +04:00
Émile Ré
aa5696b5d3 Add eslint-plugin-import
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-22 19:57:10 +04:00
Émile Ré
dd23449cc0 Fix apps/console lint issues
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-22 12:51:43 +04:00
Émile Ré
7ce73bbcfa Fix SOA permissions handling + add scope conditions
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-21 13:30:41 +04:00
Bryan Frimin
f4153b5dcc Fix missing canUpdate and canDelete
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 13:33:55 -08:00
Émile Ré
6c7bcfb50a Get rid of old trust-auth config
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-17 12:36:47 -08:00
Bryan Frimin
9eedf7aa1e Add scim events view
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 12:22:42 -08:00
Émile Ré
e4a1e75deb Get rid of previous permission providers
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 12:13:56 -08:00
Émile Ré
44ce8fdbe6 Fix vendor pages permissions handling
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 11:42:10 -08:00
Émile Ré
aa6ca266d0 Fix trust center access tab permissions handling
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 11:42:10 -08:00
Émile Ré
ea2438e345 Fix snapshot pages permissions handling
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 11:42:04 -08:00
Émile Ré
9cc6d143f6 Fix risk mapping tabs permission handling
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 11:38:53 -08:00
Émile Ré
e80766509a Fix processing activities & risks permissions pages handling
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 11:38:52 -08:00
Émile Ré
cbf338fd14 Fix people pages permissions handling
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 11:37:38 -08:00
Émile Ré
2dd7d7800b Fix obligation pages permission handling
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 11:34:02 -08:00
Émile Ré
04aecdd7e5 Fix nonconformity pages permission handling
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 11:28:32 -08:00