Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
72 lines
14 KiB
JSON
72 lines
14 KiB
JSON
[
|
|
{ "id": "F001", "description": "Define `hudu-integration` feature flag and a server-side guard (mirrors requireEntraUiFlagEnabled) that requires EE + flag, returning 404/501 otherwise", "implemented": true, "commitGroup": "scaffold", "prdRefs": ["Non-functional Requirements", "Security / Permissions"] },
|
|
{ "id": "F002", "description": "Add client-side `useFeatureFlag('hudu-integration')` gating helper for Hudu UI surfaces", "implemented": true, "commitGroup": "scaffold", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F003", "description": "Create EE route skeleton under ee/server/src/app/api/integrations/hudu with shared _guards.ts and _responses.ts helpers", "implemented": true, "commitGroup": "scaffold", "prdRefs": ["Data / API / Integrations"] },
|
|
{ "id": "F004", "description": "Create CE stub routes under server/src/app/api/integrations/hudu that lazy-import @enterprise impl and return eeUnavailable() 501 in CE", "implemented": true, "commitGroup": "scaffold", "prdRefs": ["Non-functional Requirements"] },
|
|
{ "id": "F005", "description": "Create ee/server/src/lib/integrations/hudu module folder with barrel index and contracts.ts (TypeScript types for company, asset, article, asset_password)", "implemented": true, "commitGroup": "scaffold", "prdRefs": ["Data / API / Integrations"] },
|
|
|
|
{ "id": "F010", "description": "Hudu API client: axios instance built from base URL with x-api-key header injection", "implemented": true, "commitGroup": "hudu-client", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F011", "description": "Credential resolution: tenant secret (hudu_api_key/hudu_base_url) then env fallback", "implemented": true, "commitGroup": "hudu-client", "prdRefs": ["Functional Requirements", "Security / Permissions"] },
|
|
{ "id": "F012", "description": "Pagination helper that fetches all pages (25/page) and stops when a page returns < 25 items", "implemented": true, "commitGroup": "hudu-client", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F013", "description": "Rate-limit handling: on 429 honor Retry-After + jitter, retry with a capped attempt count", "implemented": true, "commitGroup": "hudu-client", "prdRefs": ["Functional Requirements", "Non-functional Requirements"] },
|
|
{ "id": "F014", "description": "Typed error mapping for 401/403/404/422/429/5xx into a discriminated result type", "implemented": true, "commitGroup": "hudu-client", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F015", "description": "Resource-name mapping so callers use domain names while the client hits asset_passwords/procedures/etc.", "implemented": true, "commitGroup": "hudu-client", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F016", "description": "validateConnection(): GET /companies?page=1 returning ok + detected password-access capability (probe asset_passwords for 403)", "implemented": true, "commitGroup": "hudu-client", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F017", "description": "Never log API key or password values; redact in any error surfaced from the client", "implemented": true, "commitGroup": "hudu-client", "prdRefs": ["Security / Permissions", "Non-functional Requirements"] },
|
|
|
|
{ "id": "F020", "description": "EE migration (ee/server/migrations) creating hudu_integrations (tenant, integration_id PK, base_url, is_active, connected_at, last_synced_at, settings jsonb, timestamps) with on_update_timestamp trigger, following the Entra EE schema precedent", "implemented": true, "commitGroup": "connection", "prdRefs": ["Data / API / Integrations", "Rollout / Migration"] },
|
|
{ "id": "F021", "description": "Citus distribution of hudu_integrations by tenant (isCitusEnabled guard, create tenant uuid first, transaction:false)", "implemented": true, "commitGroup": "connection", "prdRefs": ["Rollout / Migration", "Non-functional Requirements"] },
|
|
{ "id": "F022", "description": "Unique constraint enforcing one Hudu connection per tenant", "implemented": true, "commitGroup": "connection", "prdRefs": ["Data / API / Integrations", "Open Questions"] },
|
|
{ "id": "F023", "description": "Model/repository for hudu_integrations (get, upsert, setActive, touchLastSynced)", "implemented": true, "commitGroup": "connection", "prdRefs": ["Data / API / Integrations"] },
|
|
{ "id": "F024", "description": "huduConnectionActions.connect: store base_url + api_key in secret provider, upsert hudu_integrations active", "implemented": true, "commitGroup": "connection", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F025", "description": "huduConnectionActions.test: validate current/candidate credentials and return status + capability", "implemented": true, "commitGroup": "connection", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F026", "description": "huduConnectionActions.getStatus: return connection state without exposing the api key", "implemented": true, "commitGroup": "connection", "prdRefs": ["Functional Requirements", "Security / Permissions"] },
|
|
{ "id": "F027", "description": "huduConnectionActions.disconnect: delete secrets, mark inactive, retain mappings", "implemented": true, "commitGroup": "connection", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F028", "description": "EE-only deletion boundary: all DELETE/cleanup of hudu_integrations (disconnect + client-/tenant-delete cascade) lives in EE code paths and EE migrations; CE never references the EE-only table. Hudu mapping cleanup operates only on the shared CE tenant_external_entity_mappings table", "implemented": true, "commitGroup": "connection", "prdRefs": ["Non-functional Requirements", "Security / Permissions"] },
|
|
|
|
{ "id": "F030", "description": "Add 'IT Documentation' category to IntegrationsSettingsPage.tsx categories with a single Hudu item (isEE:true), hidden unless EE + flag", "implemented": true, "commitGroup": "settings-ui", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F031", "description": "HuduIntegrationSettings component: base URL field, masked API key field (write-only), Test, Connect, Disconnect", "implemented": true, "commitGroup": "settings-ui", "prdRefs": ["UX / UI Notes", "Functional Requirements"] },
|
|
{ "id": "F032", "description": "Connection status badge (Not connected / Connected / Error) with detected instance + password-access indicator", "implemented": true, "commitGroup": "settings-ui", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F033", "description": "API key input never round-trips the stored value to the client; submitting blank keeps existing key", "implemented": true, "commitGroup": "settings-ui", "prdRefs": ["Security / Permissions"] },
|
|
{ "id": "F034", "description": "Inline validation + error toasts for invalid base URL (404) and invalid key (401)", "implemented": true, "commitGroup": "settings-ui", "prdRefs": ["UX / UI Notes", "Functional Requirements"] },
|
|
|
|
{ "id": "F040", "description": "huduCompanyMappingActions.syncHuduCompanies: fetch all Hudu companies and cache the list for mapping", "implemented": true, "commitGroup": "company-mapping-data", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F041", "description": "Auto-suggest matcher: id_in_integration==client_id (exact) then exact name then fuzzy name, returning a suggestion + source/confidence", "implemented": true, "commitGroup": "company-mapping-data", "prdRefs": ["Functional Requirements", "UX / UI Notes"] },
|
|
{ "id": "F042", "description": "Persist mappings in tenant_external_entity_mappings (integration_type='hudu', alga_entity_type='client', external_entity_id=hudu_company_id, metadata)", "implemented": true, "commitGroup": "company-mapping-data", "prdRefs": ["Data / API / Integrations", "Functional Requirements"] },
|
|
{ "id": "F043", "description": "Enforce one-to-one: a Hudu company maps to at most one client and vice versa within a tenant", "implemented": true, "commitGroup": "company-mapping-data", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F044", "description": "getHuduCompanyMappings: return Hudu companies joined with current mapping + suggestion + mapped client name", "implemented": true, "commitGroup": "company-mapping-data", "prdRefs": ["Functional Requirements", "UX / UI Notes"] },
|
|
{ "id": "F045", "description": "setHuduCompanyMapping / clearHuduCompanyMapping server actions writing tenant_external_entity_mappings directly, gated on system_settings (NOT the billing_settings-gated externalMappingActions wrappers)", "implemented": true, "commitGroup": "company-mapping-data", "prdRefs": ["Functional Requirements", "Security / Permissions"] },
|
|
{ "id": "F046", "description": "Resolve a client_id -> Hudu company id (and reverse) helper for downstream data fetch", "implemented": true, "commitGroup": "company-mapping-data", "prdRefs": ["Functional Requirements"] },
|
|
|
|
{ "id": "F050", "description": "HuduCompanyMappingManager component modeled on NinjaOne OrganizationMappingManager (counters, table, Refresh companies)", "implemented": true, "commitGroup": "company-mapping-ui", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F051", "description": "Per-row AlgaPSA client picker pre-filled with the suggested match; selecting persists immediately", "implemented": true, "commitGroup": "company-mapping-ui", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F052", "description": "Status badges per row (Suggested / Mapped / Unmapped) and mapped/unmapped counters", "implemented": true, "commitGroup": "company-mapping-ui", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F053", "description": "Refresh companies button re-pulls Hudu companies and recomputes suggestions without losing confirmed mappings", "implemented": true, "commitGroup": "company-mapping-ui", "prdRefs": ["UX / UI Notes", "Functional Requirements"] },
|
|
|
|
{ "id": "F060", "description": "huduDataActions.getCompanyAssets(client_id): resolve mapping, fetch Hudu assets by company_id (paginated)", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F061", "description": "huduDataActions.getCompanyArticles(client_id): fetch Hudu articles by company_id", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F062", "description": "huduDataActions.getCompanyPasswords(client_id): fetch Hudu asset_passwords metadata by company_id (no value fields retained)", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Functional Requirements", "Security / Permissions"] },
|
|
{ "id": "F063", "description": "Short-lived per-(tenant,company,resource) server cache with manual invalidation on Refresh", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Functional Requirements", "Non-functional Requirements"] },
|
|
{ "id": "F064", "description": "Strip/never-return password value fields from getCompanyPasswords payloads (name/username/url/id only)", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Security / Permissions"] },
|
|
{ "id": "F065", "description": "Build per-record Hudu deep links (per-resource url + /companies/jump fallback)", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Functional Requirements", "UX / UI Notes"] },
|
|
{ "id": "F066", "description": "Surface 403-no-password-permission as a typed state from getCompanyPasswords (not an error crash)", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Functional Requirements"] },
|
|
{ "id": "F067", "description": "revealHuduPassword(client_id, hudu_password_id): single live GET of one asset_password, return the value transiently to the caller, never persist it (DB/Vault/cache) or log it", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Security / Permissions", "Functional Requirements"] },
|
|
{ "id": "F068", "description": "Audit every password reveal (who, when, which password/company); audit entry never contains the value", "implemented": true, "commitGroup": "reference-fetch", "prdRefs": ["Security / Permissions"] },
|
|
|
|
{ "id": "F070", "description": "Client detail 'Hudu' tab host registered (visible only when EE+flag and client is mapped + connected)", "implemented": true, "commitGroup": "client-hudu-tab", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F071", "description": "Assets section: list name/type/serial with deep-link and count", "implemented": true, "commitGroup": "client-hudu-tab", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F072", "description": "Articles section: list title/folder with deep-link and count", "implemented": true, "commitGroup": "client-hudu-tab", "prdRefs": ["UX / UI Notes"] },
|
|
{ "id": "F074", "description": "Tab Refresh button and empty/error states (not connected / unmapped / unreachable)", "implemented": true, "commitGroup": "client-hudu-tab", "prdRefs": ["UX / UI Notes", "Functional Requirements"] },
|
|
{ "id": "F075", "description": "Hudu source attribution shown on the tab", "implemented": true, "commitGroup": "client-hudu-tab", "prdRefs": ["UX / UI Notes"] },
|
|
|
|
{ "id": "F080", "description": "Add a dedicated 'Passwords' tab to the Client detail page (separate from the Hudu tab), visible only when EE+flag AND Hudu connected AND client mapped", "implemented": true, "commitGroup": "client-passwords-tab", "prdRefs": ["UX / UI Notes", "Problem"] },
|
|
{ "id": "F081", "description": "Client Passwords tab lists the mapped company's Hudu asset_passwords (name/username/url) with a count (metadata only, no values)", "implemented": true, "commitGroup": "client-passwords-tab", "prdRefs": ["UX / UI Notes", "Security / Permissions"] },
|
|
{ "id": "F082", "description": "Each password row supports inline Reveal via live GET (masked/reveal-on-click, audited, never persisted to DB/Vault/cache) plus an Open-in-Hudu link", "implemented": true, "commitGroup": "client-passwords-tab", "prdRefs": ["Security / Permissions", "UX / UI Notes"] },
|
|
{ "id": "F083", "description": "Client Passwords tab empty/error states for unmapped client / disconnected / no password permission", "implemented": true, "commitGroup": "client-passwords-tab", "prdRefs": ["UX / UI Notes", "Functional Requirements"] },
|
|
|
|
{ "id": "F090", "description": "Gate all Hudu server entry points on the existing system_settings RBAC resource (read=view surfaced data, update=connect/disconnect/manage mappings); no new resource, no seeding", "implemented": true, "commitGroup": "permissions", "prdRefs": ["Security / Permissions"] },
|
|
{ "id": "F092", "description": "Apply EE + flag guard and system_settings RBAC checks to every Hudu server action and route", "implemented": true, "commitGroup": "permissions", "prdRefs": ["Security / Permissions", "Non-functional Requirements"] },
|
|
|
|
{ "id": "F100", "description": "Add translation keys for all Hudu UI strings (settings, mapping, tabs, empty/error states)", "implemented": true, "commitGroup": "i18n", "prdRefs": ["Non-functional Requirements"] }
|
|
]
|