Skip to content

Commit 83e9ef7

Browse files
committed
feat: add FlowBoard and AppSecOne adapters
Signed-off-by: Damian Skrzyński <polprog.tech@gmail.com>
1 parent a9d1bf5 commit 83e9ef7

37 files changed

Lines changed: 1612 additions & 617 deletions

CHANGELOG.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Changelog
2+
3+
All notable changes to **OpsPortal** will be documented in this file.
4+
The format is based on [Keep a Changelog](https://keepachangelog.com/).
5+
6+
## [1.1.0] — 2026-03-29
7+
8+
### Added
9+
10+
- **FlowBoard adapter** — delivery intelligence dashboards from Jira data
11+
- **AppSecOne adapter** — security posture dashboard powered by Fortify SSC
12+
- Both tools registered in manifest (`opsportal.yaml`), factory, and default configuration
13+
- 18 new tests covering adapter identity, capabilities, lifecycle, and framing env vars (256 total)
14+
15+
## [1.0.0] — 2026-03-28
16+
17+
### Added
18+
19+
- **Web dashboard** — unified operations portal with tool embedding via iframes, live status indicators, version badges, and capability tags
20+
- **CLI**`serve`, `init`, `setup`, `version` commands via Typer
21+
- **Tool orchestration** — automatic installation from remote Git sources, subprocess process management, health monitoring via `/health/live`
22+
- **Configuration** — YAML-based manifest (`opsportal.yaml`) with environment variable overrides and multi-strategy config file resolution
23+
- **Adapters** — ReleaseBoard, ReleasePilot, LocaleSync integration with JSON Schema-based config UI (save, validate, restart)
24+
- **Security** — CSRF protection, Content-Security-Policy headers with dynamic `frame-src`, `X-Frame-Options`, request sanitization
25+
- **Iframe embedding** — fallback UI for blocked embeds, width expansion controls (left/right/reset), shimmer loading skeleton
26+
- **i18n** — English and Polish translations
27+
- **238 tests** — unit, integration, security, UI regression
28+
- **Docker** support with multi-stage build
29+
- **CI/CD** pipeline configuration for GitHub Actions and GitLab CI
30+
- **Corporate proxy / SSL** support with automatic environment variable forwarding to child processes
31+
- **Remote tool sourcing** — managed installation model with `pip_git`, `pip_registry`, and `pre_installed` strategies

README.md

Lines changed: 181 additions & 108 deletions
Large diffs are not rendered by default.
330 KB
Loading
30.6 KB
Loading
-101 KB
Loading
452 KB
Loading
-78.4 KB
Loading
-92.8 KB
Loading

opsportal.yaml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,40 @@ tools:
5555
repository: POLPROG-TECH/LocaleSync
5656
ref: v1.1.0
5757
package: locale-sync
58+
install_strategy: pip_git
59+
60+
flowboard:
61+
display_name: FlowBoard
62+
description: "Delivery intelligence dashboards — from Jira data to actionable insights"
63+
integration_mode: subprocess_web
64+
icon: bar-chart-2
65+
color: "#2563EB"
66+
enabled: true
67+
port: 8084
68+
config_file: flowboard.json
69+
startup_timeout: 30
70+
env: {}
71+
source:
72+
provider: github
73+
repository: POLPROG-TECH/FlowBoard
74+
ref: v1.0.0
75+
package: flowboard
76+
install_strategy: pip_git
77+
78+
appsecone:
79+
display_name: AppSecOne
80+
description: "Security posture dashboard — release readiness powered by Fortify SSC"
81+
integration_mode: subprocess_web
82+
icon: shield
83+
color: "#DC2626"
84+
enabled: true
85+
port: 8085
86+
config_file: appsecone.json
87+
startup_timeout: 30
88+
env: {}
89+
source:
90+
provider: github
91+
repository: POLPROG-TECH/AppSecOne
92+
ref: v1.0.0
93+
package: appsecone
5894
install_strategy: pip_git

src/opsportal/__main__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def setup(
9797
their remote sources, and scaffolds default configuration files.
9898
"""
9999
from opsportal.config.manifest import DEFAULT_MANIFEST_YAML, load_manifest
100-
from opsportal.services.tool_installer import ToolInstaller
100+
from opsportal.services.tool_installer import ToolInstaller, ToolInstallError
101101

102102
# Step 1: Ensure manifest exists
103103
if not manifest.exists():
@@ -127,7 +127,7 @@ def setup(
127127
result = installer.ensure_installed(tool.source)
128128
ver = result.get("version", "?")
129129
typer.echo(f" ✔ {result['action']}: {result['package']} v{ver}")
130-
except Exception as exc:
130+
except (ToolInstallError, OSError) as exc:
131131
typer.echo(f" ✗ Install failed: {exc}", err=True)
132132
continue
133133

0 commit comments

Comments
 (0)