From c3e4ceda8a225356c0247079ef88ef737ba6a721 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 16 Apr 2026 15:24:42 +0000
Subject: [PATCH 1/7] Add onboarding orchestration CLI and Chennai FOSS demo
assets
Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/ea0c7a95-2d9a-453e-aaa1-7b54e2e22c94
Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com>
---
cli/devopsos.py | 44 ++
cli/onboard.py | 455 ++++++++++++++++++
cli/test_cli.py | 74 +++
.../chennai-foss-2026/demo-command-list.md | 5 +
.../.devcontainer/devcontainer.env.json | 68 +++
.../.devcontainer/devcontainer.json | 81 ++++
.../workflows/go-idp-service-complete.yml | 99 ++++
.../go-idp-service/onboarding-summary.json | 131 +++++
.../go-idp-service/unittest/Makefile.test | 26 +
.../unittest/go_idp_service_test.go | 37 ++
.../demo-source/go-idp-service/README.md | 3 +
.../demo-source/go-idp-service/go.mod | 3 +
.../demo-source/go-idp-service/main.go | 19 +
.../idp-onboarding-demo.html | 400 +++++++++++++++
.../content/docs/talks/chennai-foss-2026.md | 1 +
.../.devcontainer/devcontainer.env.json | 68 +++
.../.devcontainer/devcontainer.json | 81 ++++
.../workflows/go-idp-service-complete.yml | 99 ++++
.../go-idp-service/onboarding-summary.json | 131 +++++
.../go-idp-service/unittest/Makefile.test | 26 +
.../unittest/go_idp_service_test.go | 37 ++
.../idp-onboarding-demo.html | 400 +++++++++++++++
22 files changed, 2288 insertions(+)
create mode 100644 cli/onboard.py
create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json
create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json
create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml
create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json
create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test
create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go
create mode 100644 feature-announcements/chennai-foss-2026/demo-source/go-idp-service/README.md
create mode 100644 feature-announcements/chennai-foss-2026/demo-source/go-idp-service/go.mod
create mode 100644 feature-announcements/chennai-foss-2026/demo-source/go-idp-service/main.go
create mode 100644 feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json
create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json
create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml
create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json
create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test
create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go
create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
diff --git a/cli/devopsos.py b/cli/devopsos.py
index 915a093..e83e9ec 100644
--- a/cli/devopsos.py
+++ b/cli/devopsos.py
@@ -17,6 +17,7 @@
import cli.scaffold_devcontainer as scaffold_devcontainer
import cli.scaffold_unittest as scaffold_unittest
import cli.process_first as process_first
+import cli.onboard as onboard
from cli import __version__
class ProcessFirstSection(str, enum.Enum):
@@ -61,6 +62,7 @@ def main(
python -m cli.devopsos scaffold sre --help # SRE resources (SLOs, alerts, dashboards)
python -m cli.devopsos scaffold devcontainer --help # dev container configuration
python -m cli.devopsos scaffold cicd --help # combined CI/CD scaffold
+ python -m cli.devopsos onboard --repo . # onboarding POC for a local repo
python -m cli.devopsos process-first # Process-First SDLC overview
python -m cli.devopsos --version # show installed version
"""
@@ -843,6 +845,48 @@ def _sel(group): return selected_by_group.get(group, [])
typer.echo("Dockerfile uses build args; ensure it references the correct ARGs.")
+@app.command("onboard")
+def onboard_cmd(
+ repo: str = typer.Option(".", "--repo", help="Local git repository path to analyze"),
+ repo_url: str = typer.Option("", "--repo-url", help="Optional repository URL shown in the dashboard"),
+ name: str = typer.Option("demo-app", "--name", help="Application name used in generated assets"),
+ output_dir: str = typer.Option("", "--output-dir", help="Output directory for generated assets (defaults to repo path)"),
+ enable_ci: bool = typer.Option(True, "--enable-ci/--disable-ci", help="Generate GitHub Actions CI assets"),
+ enable_unittest: bool = typer.Option(True, "--enable-unittest/--disable-unittest", help="Generate unit test scaffold assets"),
+ enable_container: bool = typer.Option(True, "--enable-container/--disable-container", help="Generate container/devcontainer assets"),
+ enable_cd: bool = typer.Option(False, "--enable-cd/--disable-cd", help="Generate ArgoCD GitOps assets"),
+ enable_sre: bool = typer.Option(False, "--enable-sre/--disable-sre", help="Generate SRE/monitoring assets"),
+):
+ """Analyze a repo and scaffold a lightweight IDP onboarding POC."""
+ flags = [
+ "--repo", repo,
+ "--repo-url", repo_url,
+ "--name", name,
+ "--output-dir", output_dir,
+ ]
+ if enable_ci:
+ flags.append("--enable-ci")
+ else:
+ flags.append("--disable-ci")
+ if enable_unittest:
+ flags.append("--enable-unittest")
+ else:
+ flags.append("--disable-unittest")
+ if enable_container:
+ flags.append("--enable-container")
+ else:
+ flags.append("--disable-container")
+ if enable_cd:
+ flags.append("--enable-cd")
+ else:
+ flags.append("--disable-cd")
+ if enable_sre:
+ flags.append("--enable-sre")
+ else:
+ flags.append("--disable-sre")
+ _run_scaffold(onboard.main, flags)
+
+
@app.command("process-first")
def process_first_cmd(
section: ProcessFirstSection = typer.Option(
diff --git a/cli/onboard.py b/cli/onboard.py
new file mode 100644
index 0000000..23e1a26
--- /dev/null
+++ b/cli/onboard.py
@@ -0,0 +1,455 @@
+#!/usr/bin/env python3
+"""
+DevOps-OS onboarding POC orchestration for the Chennai FOSS demo.
+
+This module analyzes a local Git repository, detects the primary language,
+reuses the existing DevOps-OS scaffold generators, and writes a compact JSON
+summary that can be consumed by a static dashboard page.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+import os
+import subprocess
+import sys
+from collections import Counter
+from pathlib import Path
+from typing import Any
+
+from cli import scaffold_argocd, scaffold_devcontainer, scaffold_gha, scaffold_sre, scaffold_unittest
+
+
+ENV_PREFIX = "DEVOPS_OS_ONBOARD_"
+
+LANGUAGE_EXTENSIONS = {
+ "go": {".go"},
+ "python": {".py"},
+ "javascript": {".js", ".jsx", ".mjs", ".cjs"},
+ "typescript": {".ts", ".tsx"},
+ "java": {".java"},
+}
+
+IGNORED_DIRS = {
+ ".git",
+ ".venv",
+ "venv",
+ "__pycache__",
+ "node_modules",
+ ".idea",
+ ".vscode",
+ ".pytest_cache",
+ "dist",
+ "build",
+ ".next",
+ ".turbo",
+ ".github",
+ ".devcontainer",
+ "argocd",
+ "flux",
+ "sre",
+ "unittest",
+}
+
+DEVCONTAINER_LANGS = {"go", "python", "javascript", "typescript", "java"}
+UNITTEST_LANGS = {"go", "python", "javascript", "typescript"}
+
+
+def parse_arguments() -> argparse.Namespace:
+ parser = argparse.ArgumentParser(
+ description="Analyze a repo and scaffold a Chennai FOSS onboarding demo output."
+ )
+ parser.add_argument(
+ "--repo",
+ default=os.environ.get(f"{ENV_PREFIX}REPO", "."),
+ help="Local git repository path to analyze and scaffold.",
+ )
+ parser.add_argument(
+ "--repo-url",
+ default=os.environ.get(f"{ENV_PREFIX}REPO_URL", ""),
+ help="Optional repository URL shown in the dashboard.",
+ )
+ parser.add_argument(
+ "--name",
+ default=os.environ.get(f"{ENV_PREFIX}NAME", "demo-app"),
+ help="Application name used in generated templates.",
+ )
+ parser.add_argument(
+ "--output-dir",
+ default=os.environ.get(f"{ENV_PREFIX}OUTPUT_DIR", ""),
+ help="Output directory for generated assets. Defaults to the repo path.",
+ )
+ parser.add_argument(
+ "--enable-ci",
+ dest="enable_ci",
+ action="store_true",
+ default=os.environ.get(f"{ENV_PREFIX}ENABLE_CI", "true").lower() in ("1", "true", "yes"),
+ help="Generate GitHub Actions CI assets.",
+ )
+ parser.add_argument("--disable-ci", dest="enable_ci", action="store_false")
+ parser.add_argument(
+ "--enable-unittest",
+ dest="enable_unittest",
+ action="store_true",
+ default=os.environ.get(f"{ENV_PREFIX}ENABLE_UNITTEST", "true").lower()
+ in ("1", "true", "yes"),
+ help="Generate unit test scaffold assets.",
+ )
+ parser.add_argument("--disable-unittest", dest="enable_unittest", action="store_false")
+ parser.add_argument(
+ "--enable-container",
+ dest="enable_container",
+ action="store_true",
+ default=os.environ.get(f"{ENV_PREFIX}ENABLE_CONTAINER", "true").lower()
+ in ("1", "true", "yes"),
+ help="Generate container/devcontainer assets.",
+ )
+ parser.add_argument("--disable-container", dest="enable_container", action="store_false")
+ parser.add_argument(
+ "--enable-cd",
+ dest="enable_cd",
+ action="store_true",
+ default=os.environ.get(f"{ENV_PREFIX}ENABLE_CD", "false").lower() in ("1", "true", "yes"),
+ help="Generate ArgoCD GitOps assets.",
+ )
+ parser.add_argument("--disable-cd", dest="enable_cd", action="store_false")
+ parser.add_argument(
+ "--enable-sre",
+ dest="enable_sre",
+ action="store_true",
+ default=os.environ.get(f"{ENV_PREFIX}ENABLE_SRE", "false").lower() in ("1", "true", "yes"),
+ help="Generate SRE/monitoring assets.",
+ )
+ parser.add_argument("--disable-sre", dest="enable_sre", action="store_false")
+ return parser.parse_args()
+
+
+def _run_module_main(module_main, flags: list[str]) -> None:
+ saved = sys.argv[:]
+ sys.argv = sys.argv[:1] + flags
+ try:
+ module_main()
+ except SystemExit as exc:
+ if exc.code not in (None, 0):
+ raise RuntimeError(f"Generator exited with code {exc.code}: {' '.join(flags)}") from exc
+ finally:
+ sys.argv = saved
+
+
+def _git(repo_path: Path, *args: str) -> str:
+ result = subprocess.run(
+ ["git", "-C", str(repo_path), *args],
+ capture_output=True,
+ text=True,
+ check=False,
+ )
+ if result.returncode != 0:
+ raise RuntimeError(result.stderr.strip() or f"git {' '.join(args)} failed")
+ return result.stdout.strip()
+
+
+def _relative_to_output(output_dir: Path, path: Path) -> str:
+ try:
+ return str(path.resolve().relative_to(output_dir.resolve()))
+ except ValueError:
+ return str(path.resolve())
+
+
+def _safe_read_preview(path: Path, limit: int = 220) -> str:
+ try:
+ content = path.read_text()
+ except UnicodeDecodeError:
+ content = path.read_text(encoding="utf-8", errors="replace")
+ return content[:limit].strip()
+
+
+def _find_first_file(path: Path) -> Path:
+ if path.is_file():
+ return path
+ for candidate in sorted(path.rglob("*")):
+ if candidate.is_file():
+ return candidate
+ return path
+
+
+def detect_primary_language(repo_path: Path) -> tuple[str, dict[str, int]]:
+ counts: Counter[str] = Counter()
+ for root, dirs, files in os.walk(repo_path):
+ dirs[:] = [d for d in dirs if d not in IGNORED_DIRS]
+ for file_name in files:
+ extension = Path(file_name).suffix.lower()
+ for language, extensions in LANGUAGE_EXTENSIONS.items():
+ if extension in extensions:
+ counts[language] += 1
+ if not counts:
+ return "unknown", {}
+ primary_language = sorted(counts.items(), key=lambda item: (-item[1], item[0]))[0][0]
+ return primary_language, dict(counts)
+
+
+def analyze_repository(repo_path: Path, repo_url: str = "") -> dict[str, Any]:
+ branch = _git(repo_path, "rev-parse", "--abbrev-ref", "HEAD")
+ commit = _git(repo_path, "rev-parse", "--short", "HEAD")
+ if repo_url:
+ detected_url = repo_url
+ else:
+ try:
+ detected_url = _git(repo_path, "config", "--get", "remote.origin.url")
+ except RuntimeError:
+ detected_url = ""
+ primary_language, language_counts = detect_primary_language(repo_path)
+ recommended = {
+ "ci": True,
+ "unittest": primary_language in UNITTEST_LANGS,
+ "container": primary_language in DEVCONTAINER_LANGS,
+ "cd": False,
+ "sre": False,
+ }
+ return {
+ "repo_path": str(repo_path.resolve()),
+ "repo_url": detected_url,
+ "branch": branch,
+ "commit": commit,
+ "primary_language": primary_language,
+ "language_counts": language_counts,
+ "recommended_templates": recommended,
+ }
+
+
+def _workflow_filename(name: str) -> str:
+ return f"{name.lower().replace(' ', '-')}-complete.yml"
+
+
+def generate_onboarding_assets(
+ repo_path: Path,
+ output_dir: Path,
+ name: str,
+ repo_url: str,
+ enable_ci: bool,
+ enable_unittest: bool,
+ enable_container: bool,
+ enable_cd: bool,
+ enable_sre: bool,
+) -> dict[str, Any]:
+ analysis = analyze_repository(repo_path, repo_url=repo_url)
+ language = analysis["primary_language"]
+ languages_for_scaffold = language if language != "unknown" else "python"
+
+ output_dir.mkdir(parents=True, exist_ok=True)
+ artifact_records: list[dict[str, str]] = []
+
+ if enable_ci:
+ gha_flags = [
+ "--name",
+ name,
+ "--languages",
+ languages_for_scaffold,
+ "--type",
+ "complete",
+ "--output",
+ str(output_dir / ".github" / "workflows"),
+ ]
+ if enable_cd:
+ gha_flags += ["--kubernetes", "--k8s-method", "argocd"]
+ _run_module_main(scaffold_gha.main, gha_flags)
+ workflow_path = output_dir / ".github" / "workflows" / _workflow_filename(name)
+ artifact_records.append(
+ {
+ "key": "ci",
+ "label": "GitHub Actions workflow",
+ "path": _relative_to_output(output_dir, workflow_path),
+ "preview": _safe_read_preview(workflow_path),
+ }
+ )
+
+ if enable_unittest:
+ _run_module_main(
+ scaffold_unittest.main,
+ [
+ "--name",
+ name,
+ "--languages",
+ languages_for_scaffold,
+ "--output-dir",
+ str(output_dir / "unittest"),
+ ],
+ )
+ unit_target = output_dir / "unittest"
+ artifact_records.append(
+ {
+ "key": "unittest",
+ "label": "Unit test scaffold",
+ "path": _relative_to_output(output_dir, unit_target),
+ "preview": _safe_read_preview(_find_first_file(unit_target)),
+ }
+ )
+
+ if enable_container:
+ devops_tools = []
+ if enable_sre:
+ devops_tools = ["prometheus", "grafana"]
+ kubernetes_tools = ["kubectl", "helm"]
+ if enable_cd:
+ kubernetes_tools.extend(["argocd_cli", "flux"])
+ _run_module_main(
+ scaffold_devcontainer.main,
+ [
+ "--languages",
+ languages_for_scaffold,
+ "--cicd-tools",
+ "docker,github_actions",
+ "--kubernetes-tools",
+ ",".join(kubernetes_tools),
+ "--devops-tools",
+ ",".join(devops_tools),
+ "--output-dir",
+ str(output_dir),
+ ],
+ )
+ devcontainer_path = output_dir / ".devcontainer" / "devcontainer.json"
+ artifact_records.append(
+ {
+ "key": "container",
+ "label": "Dev container / container baseline",
+ "path": _relative_to_output(output_dir, devcontainer_path),
+ "preview": _safe_read_preview(devcontainer_path),
+ }
+ )
+
+ if enable_cd:
+ _run_module_main(
+ scaffold_argocd.main,
+ [
+ "--name",
+ name,
+ "--repo",
+ analysis["repo_url"] or "https://github.com/cloudengine-labs/devops_os.git",
+ "--path",
+ "k8s",
+ "--auto-sync",
+ "--output-dir",
+ str(output_dir),
+ ],
+ )
+ argocd_path = output_dir / "argocd" / "application.yaml"
+ artifact_records.append(
+ {
+ "key": "cd",
+ "label": "ArgoCD deployment template",
+ "path": _relative_to_output(output_dir, argocd_path),
+ "preview": _safe_read_preview(argocd_path),
+ }
+ )
+
+ if enable_sre:
+ _run_module_main(
+ scaffold_sre.main,
+ [
+ "--name",
+ name,
+ "--team",
+ "platform",
+ "--slo-target",
+ "99.9",
+ "--output-dir",
+ str(output_dir / "sre"),
+ ],
+ )
+ sre_path = output_dir / "sre" / "grafana-dashboard.json"
+ artifact_records.append(
+ {
+ "key": "sre",
+ "label": "SRE dashboard template",
+ "path": _relative_to_output(output_dir, sre_path),
+ "preview": _safe_read_preview(sre_path),
+ }
+ )
+
+ stages = [
+ {"key": "connected", "label": "Repo connected", "state": "done"},
+ {"key": "analysed", "label": "Branch / commit detected", "state": "done"},
+ {"key": "language", "label": f"Language detected: {analysis['primary_language']}", "state": "done"},
+ {"key": "ci", "label": "CI scaffolded", "state": "done" if enable_ci else "skipped"},
+ {
+ "key": "unittest",
+ "label": "Unit tests scaffolded",
+ "state": "done" if enable_unittest else "skipped",
+ },
+ {
+ "key": "container",
+ "label": "Containerization scaffolded",
+ "state": "done" if enable_container else "skipped",
+ },
+ {"key": "cd", "label": "CD scaffolded", "state": "done" if enable_cd else "skipped"},
+ {"key": "sre", "label": "SRE scaffolded", "state": "done" if enable_sre else "skipped"},
+ {"key": "review", "label": "Ready for review", "state": "done"},
+ ]
+
+ summary = {
+ "demo": {
+ "title": "Chennai FOSS IDP Onboarding POC",
+ "app_name": name,
+ "status_model": [
+ "Connected",
+ "Analysed",
+ "Templates selected",
+ "Generated",
+ "Ready for review",
+ "Optional deploy enabled",
+ "Optional observability enabled",
+ ],
+ "todo": {
+ "jira": [
+ "Create onboarding tasks automatically",
+ "Link generated assets to epics or stories",
+ "Sync dashboard stage updates back to Jira",
+ ],
+ "cloud": [
+ "Add cloud target selection during onboarding",
+ "Generate cloud-specific deployment overlays",
+ "Show environment and rollout status in the dashboard",
+ ],
+ },
+ },
+ "repo": analysis,
+ "selected_templates": {
+ "ci": enable_ci,
+ "unittest": enable_unittest,
+ "container": enable_container,
+ "cd": enable_cd,
+ "sre": enable_sre,
+ },
+ "stages": stages,
+ "artifacts": artifact_records,
+ "generated_output_dir": str(output_dir.resolve()),
+ }
+
+ summary_path = output_dir / "onboarding-summary.json"
+ summary_path.write_text(json.dumps(summary, indent=2))
+ return summary
+
+
+def main() -> None:
+ args = parse_arguments()
+ repo_path = Path(args.repo).resolve()
+ if not repo_path.exists() or not repo_path.is_dir():
+ raise SystemExit(f"Repository path does not exist or is not a directory: {repo_path}")
+
+ output_dir = Path(args.output_dir).resolve() if args.output_dir else repo_path
+ summary = generate_onboarding_assets(
+ repo_path=repo_path,
+ output_dir=output_dir,
+ name=args.name,
+ repo_url=args.repo_url,
+ enable_ci=args.enable_ci,
+ enable_unittest=args.enable_unittest,
+ enable_container=args.enable_container,
+ enable_cd=args.enable_cd,
+ enable_sre=args.enable_sre,
+ )
+ print(json.dumps(summary, indent=2))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/cli/test_cli.py b/cli/test_cli.py
index 48884e0..add78df 100644
--- a/cli/test_cli.py
+++ b/cli/test_cli.py
@@ -31,6 +31,7 @@ def test_help():
assert "DevOps-OS" in out
assert "scaffold" in out
assert "init" in out
+ assert "onboard" in out
assert "Examples:" in out
@@ -118,6 +119,79 @@ def test_init_checkbox_includes_space_instruction():
f"instruction '{instruction}' should mention Space so users know how to select"
)
+
+def test_onboard_help_shows_repo_option():
+ result = _run(["-m", "cli.devopsos", "onboard", "--help"])
+ assert result.returncode == 0
+ out = _strip_ansi(result.stdout)
+ assert "--repo" in out
+ assert "--enable-cd" in out
+ assert "--enable-sre" in out
+
+
+def test_onboard_generates_summary_and_assets_for_go_repo():
+ with tempfile.TemporaryDirectory() as repo_tmp, tempfile.TemporaryDirectory() as out_tmp:
+ repo = Path(repo_tmp)
+ (repo / "go.mod").write_text("module example.com/go-demo\n\ngo 1.22\n")
+ (repo / "main.go").write_text(
+ 'package main\n\nimport "fmt"\n\nfunc main() {\n\tfmt.Println("hello")\n}\n'
+ )
+ subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True, text=True)
+ subprocess.run(
+ ["git", "config", "user.name", "DevOps OS"],
+ cwd=repo,
+ check=True,
+ capture_output=True,
+ text=True,
+ )
+ subprocess.run(
+ ["git", "config", "user.email", "devops-os@example.com"],
+ cwd=repo,
+ check=True,
+ capture_output=True,
+ text=True,
+ )
+ subprocess.run(["git", "add", "."], cwd=repo, check=True, capture_output=True, text=True)
+ subprocess.run(
+ ["git", "commit", "-m", "Initial commit"],
+ cwd=repo,
+ check=True,
+ capture_output=True,
+ text=True,
+ )
+
+ result = _run(
+ [
+ "-m",
+ "cli.devopsos",
+ "onboard",
+ "--repo",
+ repo_tmp,
+ "--repo-url",
+ "https://example.com/go-demo.git",
+ "--name",
+ "go-demo",
+ "--output-dir",
+ out_tmp,
+ "--enable-cd",
+ "--enable-sre",
+ ]
+ )
+ assert result.returncode == 0, result.stderr
+
+ summary_path = Path(out_tmp) / "onboarding-summary.json"
+ assert summary_path.exists()
+ summary = json.loads(summary_path.read_text())
+ assert summary["repo"]["primary_language"] == "go"
+ assert summary["repo"]["commit"]
+ assert summary["selected_templates"]["cd"] is True
+ assert summary["selected_templates"]["sre"] is True
+ assert (Path(out_tmp) / ".github" / "workflows" / "go-demo-complete.yml").exists()
+ assert (Path(out_tmp) / "unittest").exists()
+ assert (Path(out_tmp) / ".devcontainer" / "devcontainer.json").exists()
+ assert (Path(out_tmp) / "argocd" / "application.yaml").exists()
+ assert (Path(out_tmp) / "sre" / "grafana-dashboard.json").exists()
+
def test_init_selections_written_to_config():
"""Selections made in the wizard must be reflected as True in devcontainer.env.json."""
from unittest.mock import MagicMock, patch
diff --git a/feature-announcements/chennai-foss-2026/demo-command-list.md b/feature-announcements/chennai-foss-2026/demo-command-list.md
index 90d7808..6b1b913 100644
--- a/feature-announcements/chennai-foss-2026/demo-command-list.md
+++ b/feature-announcements/chennai-foss-2026/demo-command-list.md
@@ -2,6 +2,11 @@
This demo should show **Process-First DevOps automation for a Go service** with the fewest commands possible, while still telling the full story from **build → test → deploy → monitoring**.
+## IDP onboarding POC page
+
+- Open the lightweight onboarding dashboard: `feature-announcements/chennai-foss-2026/idp-onboarding-demo.html`
+- Demo output is backed by the generated sample app assets in `feature-announcements/chennai-foss-2026/demo-output/go-idp-service/`
+
## Demo objective
Show that DevOps-OS can act as a **self-service internal developer platform (IDP) entry point** where platform teams publish reusable templates and application teams consume them with simple CLI commands.
diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json
new file mode 100644
index 0000000..c67d782
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json
@@ -0,0 +1,68 @@
+{
+ "languages": {
+ "python": false,
+ "java": false,
+ "node": false,
+ "ruby": false,
+ "csharp": false,
+ "php": false,
+ "rust": false,
+ "typescript": false,
+ "kotlin": false,
+ "c": false,
+ "cpp": false,
+ "javascript": false,
+ "go": true
+ },
+ "cicd": {
+ "docker": true,
+ "podman": false,
+ "terraform": false,
+ "kubectl": false,
+ "helm": false,
+ "github_actions": true,
+ "jenkins": false
+ },
+ "kubernetes": {
+ "k9s": false,
+ "kustomize": false,
+ "argocd_cli": true,
+ "lens": false,
+ "kubeseal": false,
+ "flux": true,
+ "kind": false,
+ "minikube": false,
+ "openshift_cli": false
+ },
+ "build_tools": {
+ "gradle": false,
+ "maven": false,
+ "ant": false,
+ "make": false,
+ "cmake": false
+ },
+ "code_analysis": {
+ "sonarqube": false,
+ "checkstyle": false,
+ "pmd": false,
+ "eslint": false,
+ "pylint": false
+ },
+ "devops_tools": {
+ "nexus": false,
+ "prometheus": true,
+ "grafana": true,
+ "elk": false,
+ "jenkins": false
+ },
+ "versions": {
+ "python": "3.12",
+ "java": "21",
+ "node": "22",
+ "go": "1.25.0",
+ "argocd": "3.3.6",
+ "flux": "2.8.5",
+ "prometheus": "3.5.1",
+ "grafana": "12.4.2"
+ }
+}
\ No newline at end of file
diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json
new file mode 100644
index 0000000..da9675a
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json
@@ -0,0 +1,81 @@
+{
+ "name": "DevOps OS - Multi-Language Development Environment",
+ "build": {
+ "dockerfile": "Dockerfile",
+ "args": {
+ "INSTALL_PYTHON": "false",
+ "INSTALL_JAVA": "false",
+ "INSTALL_JS": "false",
+ "INSTALL_RUBY": "false",
+ "INSTALL_CSHARP": "false",
+ "INSTALL_PHP": "false",
+ "INSTALL_RUST": "false",
+ "INSTALL_TYPESCRIPT": "false",
+ "INSTALL_KOTLIN": "false",
+ "INSTALL_C": "false",
+ "INSTALL_CPP": "false",
+ "INSTALL_GO": "true",
+ "INSTALL_DOCKER": "true",
+ "INSTALL_PODMAN": "false",
+ "INSTALL_TERRAFORM": "false",
+ "INSTALL_KUBECTL": "false",
+ "INSTALL_HELM": "false",
+ "INSTALL_GITHUB_ACTIONS": "true",
+ "INSTALL_JENKINS": "false",
+ "INSTALL_K9S": "false",
+ "INSTALL_KUSTOMIZE": "false",
+ "INSTALL_ARGOCD_CLI": "true",
+ "INSTALL_LENS": "false",
+ "INSTALL_KUBESEAL": "false",
+ "INSTALL_FLUX": "true",
+ "INSTALL_KIND": "false",
+ "INSTALL_MINIKUBE": "false",
+ "INSTALL_OPENSHIFT_CLI": "false",
+ "INSTALL_GRADLE": "false",
+ "INSTALL_MAVEN": "false",
+ "INSTALL_ANT": "false",
+ "INSTALL_MAKE": "false",
+ "INSTALL_CMAKE": "false",
+ "INSTALL_SONARQUBE": "false",
+ "INSTALL_CHECKSTYLE": "false",
+ "INSTALL_PMD": "false",
+ "INSTALL_ESLINT": "false",
+ "INSTALL_PYLINT": "false",
+ "INSTALL_NEXUS": "false",
+ "INSTALL_PROMETHEUS": "true",
+ "INSTALL_GRAFANA": "true",
+ "INSTALL_ELK": "false",
+ "GO_VERSION": "1.25.0",
+ "ARGOCD_VERSION": "3.3.6",
+ "FLUX_VERSION": "2.8.5",
+ "PROMETHEUS_VERSION": "3.5.1",
+ "GRAFANA_VERSION": "12.4.2"
+ }
+ },
+ "mounts": [
+ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"
+ ],
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "golang.go",
+ "ms-azuretools.vscode-docker",
+ "ms-kubernetes-tools.vscode-kubernetes-tools",
+ "mindaro.mindaro",
+ "argoproj.argocd-vscode-extension",
+ "weaveworks.vscode-gitops-tools",
+ "github.vscode-github-actions",
+ "github.copilot",
+ "github.copilot-chat",
+ "ms-vsliveshare.vsliveshare",
+ "streetsidesoftware.code-spell-checker",
+ "eamodio.gitlens"
+ ]
+ }
+ },
+ "forwardPorts": [
+ 9090,
+ 3000
+ ],
+ "postCreateCommand": "chmod +x /workspaces/.devcontainer/k8s-config-generator.py && ln -sf /workspaces/.devcontainer/k8s-config-generator.py /usr/local/bin/k8s-config-generator"
+}
\ No newline at end of file
diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml
new file mode 100644
index 0000000..69c665a
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml
@@ -0,0 +1,99 @@
+name: go-idp-service CI/CD
+'on':
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+ workflow_dispatch:
+ inputs:
+ environment:
+ description: Environment to deploy to
+ required: true
+ default: dev
+ type: choice
+ options:
+ - dev
+ - test
+ - staging
+ - prod
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/yourorg/devops-os:latest
+ options: --user root
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up build environment
+ run: echo 'Setting up build environment for DevOps-OS'
+ - name: Build Go application
+ run: if [ -f go.mod ]; then go build -v ./...; fi
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: build-artifacts
+ path: dist/
+ retention-days: 1
+ test:
+ needs:
+ - build
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/yourorg/devops-os:latest
+ options: --user root
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up test environment
+ run: echo 'Setting up test environment for DevOps-OS'
+ - name: Run Go tests
+ run: if [ -f go.mod ]; then go test -v ./...; fi
+ - name: Upload test results
+ uses: actions/upload-artifact@v3
+ with:
+ name: test-results
+ path: test-reports/
+ retention-days: 1
+ - name: Upload coverage reports
+ uses: codecov/codecov-action@v3
+ with:
+ files: ./coverage.xml,./coverage/lcov.info
+ fail_ci_if_error: false
+ deploy:
+ needs:
+ - test
+ if: github.ref == 'refs/heads/main'
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/yourorg/devops-os:latest
+ options: --user root
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up deployment environment
+ run: echo 'Setting up deployment environment for DevOps-OS'
+ - name: Build and Push Docker Image
+ if: github.ref == 'refs/heads/main'
+ run: 'echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ghcr.io -u ${{ github.actor
+ }} --password-stdin
+
+ docker build -t ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name
+ }}:latest .
+
+ docker push ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name
+ }}:latest'
+ - name: Deploy with ArgoCD
+ if: github.ref == 'refs/heads/main'
+ run: 'argocd login $ARGOCD_SERVER --username $ARGOCD_USERNAME --password $ARGOCD_PASSWORD
+ --insecure
+
+ argocd app sync my-application
+
+ argocd app wait my-application --health'
+ env:
+ ARGOCD_SERVER: ${{ secrets.ARGOCD_SERVER }}
+ ARGOCD_USERNAME: ${{ secrets.ARGOCD_USERNAME }}
+ ARGOCD_PASSWORD: ${{ secrets.ARGOCD_PASSWORD }}
diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json
new file mode 100644
index 0000000..7144a50
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json
@@ -0,0 +1,131 @@
+{
+ "demo": {
+ "title": "Chennai FOSS IDP Onboarding POC",
+ "app_name": "go-idp-service",
+ "status_model": [
+ "Connected",
+ "Analysed",
+ "Templates selected",
+ "Generated",
+ "Ready for review",
+ "Optional deploy enabled",
+ "Optional observability enabled"
+ ],
+ "todo": {
+ "jira": [
+ "Create onboarding tasks automatically",
+ "Link generated assets to epics or stories",
+ "Sync dashboard stage updates back to Jira"
+ ],
+ "cloud": [
+ "Add cloud target selection during onboarding",
+ "Generate cloud-specific deployment overlays",
+ "Show environment and rollout status in the dashboard"
+ ]
+ }
+ },
+ "repo": {
+ "repo_path": "/home/runner/work/devops_os/devops_os/feature-announcements/chennai-foss-2026/demo-source/go-idp-service",
+ "repo_url": "https://github.com/cloudengine-labs/go-idp-service-demo.git",
+ "branch": "master",
+ "commit": "c5f0654",
+ "primary_language": "go",
+ "language_counts": {
+ "go": 1
+ },
+ "recommended_templates": {
+ "ci": true,
+ "unittest": true,
+ "container": true,
+ "cd": false,
+ "sre": false
+ }
+ },
+ "selected_templates": {
+ "ci": true,
+ "unittest": true,
+ "container": true,
+ "cd": true,
+ "sre": true
+ },
+ "stages": [
+ {
+ "key": "connected",
+ "label": "Repo connected",
+ "state": "done"
+ },
+ {
+ "key": "analysed",
+ "label": "Branch / commit detected",
+ "state": "done"
+ },
+ {
+ "key": "language",
+ "label": "Language detected: go",
+ "state": "done"
+ },
+ {
+ "key": "ci",
+ "label": "CI scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "unittest",
+ "label": "Unit tests scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "container",
+ "label": "Containerization scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "cd",
+ "label": "CD scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "sre",
+ "label": "SRE scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "review",
+ "label": "Ready for review",
+ "state": "done"
+ }
+ ],
+ "artifacts": [
+ {
+ "key": "ci",
+ "label": "GitHub Actions workflow",
+ "path": ".github/workflows/go-idp-service-complete.yml",
+ "preview": "name: go-idp-service CI/CD\n'on':\n push:\n branches:\n - main\n pull_request:\n branches:\n - main\n workflow_dispatch:\n inputs:\n environment:\n description: Environment to deploy to\n require"
+ },
+ {
+ "key": "unittest",
+ "label": "Unit test scaffold",
+ "path": "unittest",
+ "preview": "# Makefile test targets for go-idp-service\n# Include these targets in your project Makefile\n\n.PHONY: test test-verbose test-race lint\n\n# Run all tests\ntest:\n\tgo test -v -count=1 ./...\n\n# Run tests with race-condition det"
+ },
+ {
+ "key": "container",
+ "label": "Dev container / container baseline",
+ "path": ".devcontainer/devcontainer.json",
+ "preview": "{\n \"name\": \"DevOps OS - Multi-Language Development Environment\",\n \"build\": {\n \"dockerfile\": \"Dockerfile\",\n \"args\": {\n \"INSTALL_PYTHON\": \"false\",\n \"INSTALL_JAVA\": \"false\",\n \"INSTALL_JS\": \"false\","
+ },
+ {
+ "key": "cd",
+ "label": "ArgoCD deployment template",
+ "path": "argocd/application.yaml",
+ "preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: go-idp-service\n namespace: argocd\n labels:\n app.kubernetes.io/name: go-idp-service\nspec:\n project: default\n source:\n repoURL: https://github."
+ },
+ {
+ "key": "sre",
+ "label": "SRE dashboard template",
+ "path": "sre/grafana-dashboard.json",
+ "preview": "{\n \"__inputs\": [\n {\n \"name\": \"DS_PROMETHEUS\",\n \"label\": \"Prometheus\",\n \"type\": \"datasource\",\n \"pluginId\": \"prometheus\"\n }\n ],\n \"__requires\": [\n {\n \"type\": \"grafana\",\n \"id\": \"graf"
+ }
+ ],
+ "generated_output_dir": "/home/runner/work/devops_os/devops_os/feature-announcements/chennai-foss-2026/demo-output/go-idp-service"
+}
\ No newline at end of file
diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test
new file mode 100644
index 0000000..6021b48
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test
@@ -0,0 +1,26 @@
+# Makefile test targets for go-idp-service
+# Include these targets in your project Makefile
+
+.PHONY: test test-verbose test-race lint
+
+# Run all tests
+test:
+ go test -v -count=1 ./...
+
+# Run tests with race-condition detector
+test-race:
+ go test -race -v ./...
+
+# Run tests with coverage
+test-cov:
+ go test -v -coverprofile=coverage_go_idp_service.out ./...
+ go tool cover -func=coverage_go_idp_service.out
+
+# Generate HTML coverage report
+test-coverage: test
+ go tool cover -html=coverage_go_idp_service.out -o coverage_go_idp_service.html
+ @echo "Coverage report: coverage_go_idp_service.html"
+
+# Run go vet and staticcheck
+lint:
+ go vet ./...
diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go
new file mode 100644
index 0000000..4075bbb
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go
@@ -0,0 +1,37 @@
+// Package go_idp_service provides unit tests for go-idp-service.
+package go_idp_service_test
+
+import (
+ "testing"
+)
+
+// TestAdd verifies basic arithmetic — replace with real application tests.
+func TestAdd(t *testing.T) {
+ result := 1 + 1
+ if result != 2 {
+ t.Errorf("expected 2, got %d", result)
+ }
+}
+
+func TestStringContains(t *testing.T) {
+ greeting := "Hello from go-idp-service"
+ if len(greeting) == 0 {
+ t.Error("expected non-empty greeting")
+ }
+}
+
+func TestTableDriven(t *testing.T) {
+ cases := []struct {
+ a, b, want int
+ }{
+ {1, 2, 3},
+ {0, 0, 0},
+ {-1, 1, 0},
+ }
+ for _, tc := range cases {
+ got := tc.a + tc.b
+ if got != tc.want {
+ t.Errorf("add(%d, %d) = %d; want %d", tc.a, tc.b, got, tc.want)
+ }
+ }
+}
diff --git a/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/README.md b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/README.md
new file mode 100644
index 0000000..821688c
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/README.md
@@ -0,0 +1,3 @@
+# Go IDP Service
+
+Minimal Go service used as the Chennai FOSS onboarding demo input.
diff --git a/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/go.mod b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/go.mod
new file mode 100644
index 0000000..e114973
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/go.mod
@@ -0,0 +1,3 @@
+module example.com/go-idp-service
+
+go 1.22
diff --git a/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/main.go b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/main.go
new file mode 100644
index 0000000..e6c048a
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/main.go
@@ -0,0 +1,19 @@
+package main
+
+import (
+ "encoding/json"
+ "log"
+ "net/http"
+)
+
+func main() {
+ http.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) {
+ _ = json.NewEncoder(w).Encode(map[string]string{
+ "status": "ok",
+ "service": "go-idp-service",
+ })
+ })
+
+ log.Println("go-idp-service listening on :8080")
+ log.Fatal(http.ListenAndServe(":8080", nil))
+}
diff --git a/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html b/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
new file mode 100644
index 0000000..edfb2bc
--- /dev/null
+++ b/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
@@ -0,0 +1,400 @@
+
+
+
+
+
+ DevOps-OS IDP Onboarding Demo
+
+
+
+
+
+ Chennai FOSS • IDP POC
+ App onboarding as a lightweight internal developer platform
+
+ This demo turns DevOps-OS into a self-service onboarding experience: detect repo metadata,
+ infer the main language, preselect platform templates, generate delivery assets, and show
+ onboarding status in one dashboard.
+
+
+ Back to presentation
+
+
+
+
+
+
+ Onboarding form
+
Platform defaults
+
+
+
+ Git repo URL
+
+
+
+ Local repo path
+
+
+
+
+
+
+
Generate Platform Assets
+
The committed demo output below was generated by the new devopsos onboard command.
+
+
+
+
+
+
+
Generated assets
+
What the platform created
+
+
+
+
+
Next integrations
+
TODO
+
+
+
Jira / task management
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hugo-docs/content/docs/talks/chennai-foss-2026.md b/hugo-docs/content/docs/talks/chennai-foss-2026.md
index 67a2527..b0dc29c 100644
--- a/hugo-docs/content/docs/talks/chennai-foss-2026.md
+++ b/hugo-docs/content/docs/talks/chennai-foss-2026.md
@@ -8,6 +8,7 @@ weight: 10
Open the deck directly or use the embedded view below during the session.
- [Open presentation in a new tab](../../../feature-announcements/chennai-foss-2026/)
+- [Open the IDP onboarding demo](../../../feature-announcements/chennai-foss-2026/idp-onboarding-demo.html)
- [Open the Talks section]({{< relref "/docs/talks" >}})
diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json
new file mode 100644
index 0000000..c67d782
--- /dev/null
+++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json
@@ -0,0 +1,68 @@
+{
+ "languages": {
+ "python": false,
+ "java": false,
+ "node": false,
+ "ruby": false,
+ "csharp": false,
+ "php": false,
+ "rust": false,
+ "typescript": false,
+ "kotlin": false,
+ "c": false,
+ "cpp": false,
+ "javascript": false,
+ "go": true
+ },
+ "cicd": {
+ "docker": true,
+ "podman": false,
+ "terraform": false,
+ "kubectl": false,
+ "helm": false,
+ "github_actions": true,
+ "jenkins": false
+ },
+ "kubernetes": {
+ "k9s": false,
+ "kustomize": false,
+ "argocd_cli": true,
+ "lens": false,
+ "kubeseal": false,
+ "flux": true,
+ "kind": false,
+ "minikube": false,
+ "openshift_cli": false
+ },
+ "build_tools": {
+ "gradle": false,
+ "maven": false,
+ "ant": false,
+ "make": false,
+ "cmake": false
+ },
+ "code_analysis": {
+ "sonarqube": false,
+ "checkstyle": false,
+ "pmd": false,
+ "eslint": false,
+ "pylint": false
+ },
+ "devops_tools": {
+ "nexus": false,
+ "prometheus": true,
+ "grafana": true,
+ "elk": false,
+ "jenkins": false
+ },
+ "versions": {
+ "python": "3.12",
+ "java": "21",
+ "node": "22",
+ "go": "1.25.0",
+ "argocd": "3.3.6",
+ "flux": "2.8.5",
+ "prometheus": "3.5.1",
+ "grafana": "12.4.2"
+ }
+}
\ No newline at end of file
diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json
new file mode 100644
index 0000000..da9675a
--- /dev/null
+++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json
@@ -0,0 +1,81 @@
+{
+ "name": "DevOps OS - Multi-Language Development Environment",
+ "build": {
+ "dockerfile": "Dockerfile",
+ "args": {
+ "INSTALL_PYTHON": "false",
+ "INSTALL_JAVA": "false",
+ "INSTALL_JS": "false",
+ "INSTALL_RUBY": "false",
+ "INSTALL_CSHARP": "false",
+ "INSTALL_PHP": "false",
+ "INSTALL_RUST": "false",
+ "INSTALL_TYPESCRIPT": "false",
+ "INSTALL_KOTLIN": "false",
+ "INSTALL_C": "false",
+ "INSTALL_CPP": "false",
+ "INSTALL_GO": "true",
+ "INSTALL_DOCKER": "true",
+ "INSTALL_PODMAN": "false",
+ "INSTALL_TERRAFORM": "false",
+ "INSTALL_KUBECTL": "false",
+ "INSTALL_HELM": "false",
+ "INSTALL_GITHUB_ACTIONS": "true",
+ "INSTALL_JENKINS": "false",
+ "INSTALL_K9S": "false",
+ "INSTALL_KUSTOMIZE": "false",
+ "INSTALL_ARGOCD_CLI": "true",
+ "INSTALL_LENS": "false",
+ "INSTALL_KUBESEAL": "false",
+ "INSTALL_FLUX": "true",
+ "INSTALL_KIND": "false",
+ "INSTALL_MINIKUBE": "false",
+ "INSTALL_OPENSHIFT_CLI": "false",
+ "INSTALL_GRADLE": "false",
+ "INSTALL_MAVEN": "false",
+ "INSTALL_ANT": "false",
+ "INSTALL_MAKE": "false",
+ "INSTALL_CMAKE": "false",
+ "INSTALL_SONARQUBE": "false",
+ "INSTALL_CHECKSTYLE": "false",
+ "INSTALL_PMD": "false",
+ "INSTALL_ESLINT": "false",
+ "INSTALL_PYLINT": "false",
+ "INSTALL_NEXUS": "false",
+ "INSTALL_PROMETHEUS": "true",
+ "INSTALL_GRAFANA": "true",
+ "INSTALL_ELK": "false",
+ "GO_VERSION": "1.25.0",
+ "ARGOCD_VERSION": "3.3.6",
+ "FLUX_VERSION": "2.8.5",
+ "PROMETHEUS_VERSION": "3.5.1",
+ "GRAFANA_VERSION": "12.4.2"
+ }
+ },
+ "mounts": [
+ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"
+ ],
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "golang.go",
+ "ms-azuretools.vscode-docker",
+ "ms-kubernetes-tools.vscode-kubernetes-tools",
+ "mindaro.mindaro",
+ "argoproj.argocd-vscode-extension",
+ "weaveworks.vscode-gitops-tools",
+ "github.vscode-github-actions",
+ "github.copilot",
+ "github.copilot-chat",
+ "ms-vsliveshare.vsliveshare",
+ "streetsidesoftware.code-spell-checker",
+ "eamodio.gitlens"
+ ]
+ }
+ },
+ "forwardPorts": [
+ 9090,
+ 3000
+ ],
+ "postCreateCommand": "chmod +x /workspaces/.devcontainer/k8s-config-generator.py && ln -sf /workspaces/.devcontainer/k8s-config-generator.py /usr/local/bin/k8s-config-generator"
+}
\ No newline at end of file
diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml
new file mode 100644
index 0000000..69c665a
--- /dev/null
+++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml
@@ -0,0 +1,99 @@
+name: go-idp-service CI/CD
+'on':
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+ workflow_dispatch:
+ inputs:
+ environment:
+ description: Environment to deploy to
+ required: true
+ default: dev
+ type: choice
+ options:
+ - dev
+ - test
+ - staging
+ - prod
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/yourorg/devops-os:latest
+ options: --user root
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up build environment
+ run: echo 'Setting up build environment for DevOps-OS'
+ - name: Build Go application
+ run: if [ -f go.mod ]; then go build -v ./...; fi
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: build-artifacts
+ path: dist/
+ retention-days: 1
+ test:
+ needs:
+ - build
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/yourorg/devops-os:latest
+ options: --user root
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up test environment
+ run: echo 'Setting up test environment for DevOps-OS'
+ - name: Run Go tests
+ run: if [ -f go.mod ]; then go test -v ./...; fi
+ - name: Upload test results
+ uses: actions/upload-artifact@v3
+ with:
+ name: test-results
+ path: test-reports/
+ retention-days: 1
+ - name: Upload coverage reports
+ uses: codecov/codecov-action@v3
+ with:
+ files: ./coverage.xml,./coverage/lcov.info
+ fail_ci_if_error: false
+ deploy:
+ needs:
+ - test
+ if: github.ref == 'refs/heads/main'
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/yourorg/devops-os:latest
+ options: --user root
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up deployment environment
+ run: echo 'Setting up deployment environment for DevOps-OS'
+ - name: Build and Push Docker Image
+ if: github.ref == 'refs/heads/main'
+ run: 'echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ghcr.io -u ${{ github.actor
+ }} --password-stdin
+
+ docker build -t ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name
+ }}:latest .
+
+ docker push ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name
+ }}:latest'
+ - name: Deploy with ArgoCD
+ if: github.ref == 'refs/heads/main'
+ run: 'argocd login $ARGOCD_SERVER --username $ARGOCD_USERNAME --password $ARGOCD_PASSWORD
+ --insecure
+
+ argocd app sync my-application
+
+ argocd app wait my-application --health'
+ env:
+ ARGOCD_SERVER: ${{ secrets.ARGOCD_SERVER }}
+ ARGOCD_USERNAME: ${{ secrets.ARGOCD_USERNAME }}
+ ARGOCD_PASSWORD: ${{ secrets.ARGOCD_PASSWORD }}
diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json
new file mode 100644
index 0000000..7144a50
--- /dev/null
+++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json
@@ -0,0 +1,131 @@
+{
+ "demo": {
+ "title": "Chennai FOSS IDP Onboarding POC",
+ "app_name": "go-idp-service",
+ "status_model": [
+ "Connected",
+ "Analysed",
+ "Templates selected",
+ "Generated",
+ "Ready for review",
+ "Optional deploy enabled",
+ "Optional observability enabled"
+ ],
+ "todo": {
+ "jira": [
+ "Create onboarding tasks automatically",
+ "Link generated assets to epics or stories",
+ "Sync dashboard stage updates back to Jira"
+ ],
+ "cloud": [
+ "Add cloud target selection during onboarding",
+ "Generate cloud-specific deployment overlays",
+ "Show environment and rollout status in the dashboard"
+ ]
+ }
+ },
+ "repo": {
+ "repo_path": "/home/runner/work/devops_os/devops_os/feature-announcements/chennai-foss-2026/demo-source/go-idp-service",
+ "repo_url": "https://github.com/cloudengine-labs/go-idp-service-demo.git",
+ "branch": "master",
+ "commit": "c5f0654",
+ "primary_language": "go",
+ "language_counts": {
+ "go": 1
+ },
+ "recommended_templates": {
+ "ci": true,
+ "unittest": true,
+ "container": true,
+ "cd": false,
+ "sre": false
+ }
+ },
+ "selected_templates": {
+ "ci": true,
+ "unittest": true,
+ "container": true,
+ "cd": true,
+ "sre": true
+ },
+ "stages": [
+ {
+ "key": "connected",
+ "label": "Repo connected",
+ "state": "done"
+ },
+ {
+ "key": "analysed",
+ "label": "Branch / commit detected",
+ "state": "done"
+ },
+ {
+ "key": "language",
+ "label": "Language detected: go",
+ "state": "done"
+ },
+ {
+ "key": "ci",
+ "label": "CI scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "unittest",
+ "label": "Unit tests scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "container",
+ "label": "Containerization scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "cd",
+ "label": "CD scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "sre",
+ "label": "SRE scaffolded",
+ "state": "done"
+ },
+ {
+ "key": "review",
+ "label": "Ready for review",
+ "state": "done"
+ }
+ ],
+ "artifacts": [
+ {
+ "key": "ci",
+ "label": "GitHub Actions workflow",
+ "path": ".github/workflows/go-idp-service-complete.yml",
+ "preview": "name: go-idp-service CI/CD\n'on':\n push:\n branches:\n - main\n pull_request:\n branches:\n - main\n workflow_dispatch:\n inputs:\n environment:\n description: Environment to deploy to\n require"
+ },
+ {
+ "key": "unittest",
+ "label": "Unit test scaffold",
+ "path": "unittest",
+ "preview": "# Makefile test targets for go-idp-service\n# Include these targets in your project Makefile\n\n.PHONY: test test-verbose test-race lint\n\n# Run all tests\ntest:\n\tgo test -v -count=1 ./...\n\n# Run tests with race-condition det"
+ },
+ {
+ "key": "container",
+ "label": "Dev container / container baseline",
+ "path": ".devcontainer/devcontainer.json",
+ "preview": "{\n \"name\": \"DevOps OS - Multi-Language Development Environment\",\n \"build\": {\n \"dockerfile\": \"Dockerfile\",\n \"args\": {\n \"INSTALL_PYTHON\": \"false\",\n \"INSTALL_JAVA\": \"false\",\n \"INSTALL_JS\": \"false\","
+ },
+ {
+ "key": "cd",
+ "label": "ArgoCD deployment template",
+ "path": "argocd/application.yaml",
+ "preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: go-idp-service\n namespace: argocd\n labels:\n app.kubernetes.io/name: go-idp-service\nspec:\n project: default\n source:\n repoURL: https://github."
+ },
+ {
+ "key": "sre",
+ "label": "SRE dashboard template",
+ "path": "sre/grafana-dashboard.json",
+ "preview": "{\n \"__inputs\": [\n {\n \"name\": \"DS_PROMETHEUS\",\n \"label\": \"Prometheus\",\n \"type\": \"datasource\",\n \"pluginId\": \"prometheus\"\n }\n ],\n \"__requires\": [\n {\n \"type\": \"grafana\",\n \"id\": \"graf"
+ }
+ ],
+ "generated_output_dir": "/home/runner/work/devops_os/devops_os/feature-announcements/chennai-foss-2026/demo-output/go-idp-service"
+}
\ No newline at end of file
diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test
new file mode 100644
index 0000000..6021b48
--- /dev/null
+++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test
@@ -0,0 +1,26 @@
+# Makefile test targets for go-idp-service
+# Include these targets in your project Makefile
+
+.PHONY: test test-verbose test-race lint
+
+# Run all tests
+test:
+ go test -v -count=1 ./...
+
+# Run tests with race-condition detector
+test-race:
+ go test -race -v ./...
+
+# Run tests with coverage
+test-cov:
+ go test -v -coverprofile=coverage_go_idp_service.out ./...
+ go tool cover -func=coverage_go_idp_service.out
+
+# Generate HTML coverage report
+test-coverage: test
+ go tool cover -html=coverage_go_idp_service.out -o coverage_go_idp_service.html
+ @echo "Coverage report: coverage_go_idp_service.html"
+
+# Run go vet and staticcheck
+lint:
+ go vet ./...
diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go
new file mode 100644
index 0000000..4075bbb
--- /dev/null
+++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go
@@ -0,0 +1,37 @@
+// Package go_idp_service provides unit tests for go-idp-service.
+package go_idp_service_test
+
+import (
+ "testing"
+)
+
+// TestAdd verifies basic arithmetic — replace with real application tests.
+func TestAdd(t *testing.T) {
+ result := 1 + 1
+ if result != 2 {
+ t.Errorf("expected 2, got %d", result)
+ }
+}
+
+func TestStringContains(t *testing.T) {
+ greeting := "Hello from go-idp-service"
+ if len(greeting) == 0 {
+ t.Error("expected non-empty greeting")
+ }
+}
+
+func TestTableDriven(t *testing.T) {
+ cases := []struct {
+ a, b, want int
+ }{
+ {1, 2, 3},
+ {0, 0, 0},
+ {-1, 1, 0},
+ }
+ for _, tc := range cases {
+ got := tc.a + tc.b
+ if got != tc.want {
+ t.Errorf("add(%d, %d) = %d; want %d", tc.a, tc.b, got, tc.want)
+ }
+ }
+}
diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html b/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
new file mode 100644
index 0000000..edfb2bc
--- /dev/null
+++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
@@ -0,0 +1,400 @@
+
+
+
+
+
+
DevOps-OS IDP Onboarding Demo
+
+
+
+
+
+ Chennai FOSS • IDP POC
+ App onboarding as a lightweight internal developer platform
+
+ This demo turns DevOps-OS into a self-service onboarding experience: detect repo metadata,
+ infer the main language, preselect platform templates, generate delivery assets, and show
+ onboarding status in one dashboard.
+
+
+ Back to presentation
+
+
+
+
+
+
+ Onboarding form
+
Platform defaults
+
+
+
+ Git repo URL
+
+
+
+ Local repo path
+
+
+
+
+
+
+
Generate Platform Assets
+
The committed demo output below was generated by the new devopsos onboard command.
+
+
+
+
+
+
+
Generated assets
+
What the platform created
+
+
+
+
+
Next integrations
+
TODO
+
+
+
Jira / task management
+
+
+
+
+
+
+
+
+
+
+
+
From 7d62465e2b7cd87277865946faf6cf4c447999a1 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 16 Apr 2026 15:27:28 +0000
Subject: [PATCH 2/7] Polish Chennai FOSS onboarding dashboard flow
Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/ea0c7a95-2d9a-453e-aaa1-7b54e2e22c94
Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com>
---
.../chennai-foss-2026/idp-onboarding-demo.html | 2 +-
go-project/go.mod | 4 ----
go-project/go.sum | 7 -------
hugo-docs/go.mod | 2 --
hugo-docs/go.sum | 2 --
.../chennai-foss-2026/idp-onboarding-demo.html | 2 +-
6 files changed, 2 insertions(+), 17 deletions(-)
diff --git a/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html b/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
index edfb2bc..9a95140 100644
--- a/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
+++ b/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
@@ -372,7 +372,7 @@
TODO
setToggle("toggle-container", summary.selected_templates.container);
setToggle("toggle-cd", summary.selected_templates.cd);
setToggle("toggle-sre", summary.selected_templates.sre);
- renderTimeline(summary.stages.map((stage, index) => ({...stage, state: index === 0 ? "pending" : "pending"})));
+ renderTimeline(summary.stages.map((stage) => ({...stage, state: "pending"})));
renderArtifacts(summary.artifacts);
renderList("jira-list", summary.demo.todo.jira);
renderList("cloud-list", summary.demo.todo.cloud);
diff --git a/go-project/go.mod b/go-project/go.mod
index 12b37ce..dd04cd6 100644
--- a/go-project/go.mod
+++ b/go-project/go.mod
@@ -1,7 +1,3 @@
module go-project
go 1.16
-
-require (
- // Add your dependencies here
-)
\ No newline at end of file
diff --git a/go-project/go.sum b/go-project/go.sum
index 06e0d10..e69de29 100644
--- a/go-project/go.sum
+++ b/go-project/go.sum
@@ -1,7 +0,0 @@
-go: module example.com/go-project
-
-# indirect
-github.com/gin-gonic/gin v1.7.4 // indirect
-github.com/stretchr/testify v1.7.0 // indirect
-golang.org/x/net v0.0.0-20220316182356-1c4e7f4e8b2e // indirect
-golang.org/x/sys v0.0.0-20220316182356-1c4e7f4e8b2e // indirect
\ No newline at end of file
diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod
index c363f3e..5d91405 100644
--- a/hugo-docs/go.mod
+++ b/hugo-docs/go.mod
@@ -1,5 +1,3 @@
module github.com/cloudengine-labs/devops_os/hugo-docs
go 1.21.0
-
-require github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 // indirect
diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum
index 2510024..e69de29 100644
--- a/hugo-docs/go.sum
+++ b/hugo-docs/go.sum
@@ -1,2 +0,0 @@
-github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 h1:LQYO67RaSBiWnW3ZPyVPZCVTOFaNK/dc/ZRbh8Wu8Wo=
-github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds=
diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html b/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
index edfb2bc..9a95140 100644
--- a/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
+++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html
@@ -372,7 +372,7 @@
TODO
setToggle("toggle-container", summary.selected_templates.container);
setToggle("toggle-cd", summary.selected_templates.cd);
setToggle("toggle-sre", summary.selected_templates.sre);
- renderTimeline(summary.stages.map((stage, index) => ({...stage, state: index === 0 ? "pending" : "pending"})));
+ renderTimeline(summary.stages.map((stage) => ({...stage, state: "pending"})));
renderArtifacts(summary.artifacts);
renderList("jira-list", summary.demo.todo.jira);
renderList("cloud-list", summary.demo.todo.cloud);
From 56f0dbea57ee05bed58a6fd2e0da33f6632a90a4 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 16 Apr 2026 15:28:40 +0000
Subject: [PATCH 3/7] Restore unrelated Go module metadata
Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/ea0c7a95-2d9a-453e-aaa1-7b54e2e22c94
Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com>
---
go-project/go.mod | 4 ++++
go-project/go.sum | 7 +++++++
hugo-docs/go.mod | 2 ++
hugo-docs/go.sum | 2 ++
4 files changed, 15 insertions(+)
diff --git a/go-project/go.mod b/go-project/go.mod
index dd04cd6..12b37ce 100644
--- a/go-project/go.mod
+++ b/go-project/go.mod
@@ -1,3 +1,7 @@
module go-project
go 1.16
+
+require (
+ // Add your dependencies here
+)
\ No newline at end of file
diff --git a/go-project/go.sum b/go-project/go.sum
index e69de29..06e0d10 100644
--- a/go-project/go.sum
+++ b/go-project/go.sum
@@ -0,0 +1,7 @@
+go: module example.com/go-project
+
+# indirect
+github.com/gin-gonic/gin v1.7.4 // indirect
+github.com/stretchr/testify v1.7.0 // indirect
+golang.org/x/net v0.0.0-20220316182356-1c4e7f4e8b2e // indirect
+golang.org/x/sys v0.0.0-20220316182356-1c4e7f4e8b2e // indirect
\ No newline at end of file
diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod
index 5d91405..c363f3e 100644
--- a/hugo-docs/go.mod
+++ b/hugo-docs/go.mod
@@ -1,3 +1,5 @@
module github.com/cloudengine-labs/devops_os/hugo-docs
go 1.21.0
+
+require github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 // indirect
diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum
index e69de29..2510024 100644
--- a/hugo-docs/go.sum
+++ b/hugo-docs/go.sum
@@ -0,0 +1,2 @@
+github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 h1:LQYO67RaSBiWnW3ZPyVPZCVTOFaNK/dc/ZRbh8Wu8Wo=
+github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds=
From 9c56138d1b15d24f91600af55d12e6bb27958aa7 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 16 Apr 2026 16:17:16 +0000
Subject: [PATCH 4/7] Plan Hugo branch preview support
Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/da764e3f-6ccf-4173-87cc-3bff9ee56e38
Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com>
---
hugo-docs/go.mod | 2 +-
hugo-docs/go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod
index c363f3e..1a12a8b 100644
--- a/hugo-docs/go.mod
+++ b/hugo-docs/go.mod
@@ -2,4 +2,4 @@ module github.com/cloudengine-labs/devops_os/hugo-docs
go 1.21.0
-require github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 // indirect
+require github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 // indirect
diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum
index 2510024..2182013 100644
--- a/hugo-docs/go.sum
+++ b/hugo-docs/go.sum
@@ -1,2 +1,2 @@
-github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 h1:LQYO67RaSBiWnW3ZPyVPZCVTOFaNK/dc/ZRbh8Wu8Wo=
-github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds=
+github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 h1:vwHQ2uXe6gC9kXre7P29AqWYB8Gek5iQTGnJHKBbqDg=
+github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds=
From 4e0f99ccc1737f4c5daefe34a71912e48377b125 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 16 Apr 2026 16:20:54 +0000
Subject: [PATCH 5/7] Add Hugo branch preview workflow
Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/da764e3f-6ccf-4173-87cc-3bff9ee56e38
Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com>
---
.github/workflows/hugo-preview.yml | 94 ++++++++++++++++++++++++++++++
.github/workflows/pages.yml | 2 +-
CONTRIBUTING.md | 10 ++++
README.md | 31 ++++++++++
4 files changed, 136 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/hugo-preview.yml
diff --git a/.github/workflows/hugo-preview.yml b/.github/workflows/hugo-preview.yml
new file mode 100644
index 0000000..8bea550
--- /dev/null
+++ b/.github/workflows/hugo-preview.yml
@@ -0,0 +1,94 @@
+name: Build Hugo Preview
+
+on:
+ push:
+ branches-ignore:
+ - main
+ paths:
+ - ".github/workflows/pages.yml"
+ - ".github/workflows/hugo-preview.yml"
+ - "hugo-docs/**"
+ - "feature-announcements/**"
+ pull_request:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/pages.yml"
+ - ".github/workflows/hugo-preview.yml"
+ - "hugo-docs/**"
+ - "feature-announcements/**"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: "hugo-preview-${{ github.ref }}"
+ cancel-in-progress: true
+
+defaults:
+ run:
+ shell: bash
+
+jobs:
+ build-preview:
+ runs-on: ubuntu-latest
+ env:
+ HUGO_VERSION: "0.158.0"
+ PREVIEW_BASEURL: "http://127.0.0.1:1313/"
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version: "1.22"
+
+ - name: Install Hugo CLI
+ run: |
+ wget -O "${{ runner.temp }}/hugo.deb" \
+ "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb"
+ sudo dpkg -i "${{ runner.temp }}/hugo.deb"
+
+ - name: Download Hugo modules
+ working-directory: ./hugo-docs
+ run: hugo mod tidy
+
+ - name: Build Hugo preview site
+ working-directory: ./hugo-docs
+ env:
+ HUGO_ENVIRONMENT: production
+ HUGO_BASEURL: ${{ env.PREVIEW_BASEURL }}
+ run: hugo --gc --minify
+
+ - name: Upload Hugo preview artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: hugo-preview-${{ github.run_number }}
+ path: ./hugo-docs/public
+ if-no-files-found: error
+ retention-days: 7
+
+ - name: Publish preview instructions
+ run: |
+ {
+ echo "## Hugo branch preview"
+ echo
+ echo "Artifact: \`hugo-preview-${{ github.run_number }}\`"
+ echo
+ echo "After downloading the artifact, serve the extracted \`public/\` directory locally:"
+ echo
+ echo "\`\`\`bash"
+ echo "python -m http.server 1313 -d public"
+ echo "\`\`\`"
+ echo
+ echo "Then verify:"
+ echo
+ echo "- http://127.0.0.1:1313/docs/talks/chennai-foss-2026/"
+ echo "- http://127.0.0.1:1313/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html"
+ echo
+ echo "For a one-off hosted check, you can still run the production Pages workflow manually on this branch, but that deploys to the shared GitHub Pages environment."
+ } >> "$GITHUB_STEP_SUMMARY"
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
index 3e833ca..d8fbd91 100644
--- a/.github/workflows/pages.yml
+++ b/.github/workflows/pages.yml
@@ -24,7 +24,7 @@ jobs:
build:
runs-on: ubuntu-latest
env:
- HUGO_VERSION: "0.147.0"
+ HUGO_VERSION: "0.158.0"
steps:
- name: Checkout repository
uses: actions/checkout@v4
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 034f172..b03ce3f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -32,6 +32,16 @@ Please be respectful and constructive in all interactions. We are committed to p
```bash
python -m pytest cli/test_cli.py mcp_server/test_server.py tests/test_comprehensive.py -v
```
+4. If your change touches the Hugo docs or the Chennai FOSS demo pages, preview them from your branch before opening a PR:
+ ```bash
+ cd /home/runner/work/devops_os/devops_os/hugo-docs
+ hugo mod tidy
+ hugo server --bind 0.0.0.0 --baseURL http://localhost:1313/
+ ```
+ Verify:
+ - `http://localhost:1313/docs/talks/chennai-foss-2026/`
+ - `http://localhost:1313/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html`
+ You can also run the **Build Hugo Preview** workflow to get a downloadable preview artifact without deploying to the production Pages site.
---
diff --git a/README.md b/README.md
index f9c2dee..8871b42 100644
--- a/README.md
+++ b/README.md
@@ -399,6 +399,37 @@ You can also customize `.devcontainer/devcontainer.env.json` directly to enable
---
+## 🌐 Hugo branch preview
+
+The production GitHub Pages site is still deployed only from `main`, but you can test the Hugo-hosted Chennai FOSS IDP UI from your current branch in two safe ways.
+
+### Local preview
+
+```bash
+cd /home/runner/work/devops_os/devops_os/hugo-docs
+hugo mod tidy
+hugo server --bind 0.0.0.0 --baseURL http://localhost:1313/
+```
+
+Then verify:
+
+- `http://localhost:1313/docs/talks/chennai-foss-2026/`
+- `http://localhost:1313/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html`
+
+### GitHub Actions preview artifact
+
+Use the **Build Hugo Preview** workflow on your branch. It builds the Hugo site without deploying to the shared GitHub Pages environment and uploads the generated `public/` directory as an artifact.
+
+After downloading the artifact, serve it locally:
+
+```bash
+python -m http.server 1313 -d public
+```
+
+For a one-off hosted verification, you can still manually run **Deploy Hugo Documentation** on your branch with `workflow_dispatch`, but that updates the shared Pages site.
+
+---
+
## 🤝 Contributing
Contributions are welcome! Whether it's a bug fix, a new scaffold generator, or documentation improvement — feel free to open an issue or submit a pull request.
From 0a036c0ca7c38b2724cee80271c3d510c037e679 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 16 Apr 2026 16:22:31 +0000
Subject: [PATCH 6/7] Finalize Hugo branch preview support
Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/da764e3f-6ccf-4173-87cc-3bff9ee56e38
Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com>
---
go-project/go.mod | 4 ----
go-project/go.sum | 7 -------
hugo-docs/go.mod | 2 --
hugo-docs/go.sum | 2 --
4 files changed, 15 deletions(-)
diff --git a/go-project/go.mod b/go-project/go.mod
index 12b37ce..dd04cd6 100644
--- a/go-project/go.mod
+++ b/go-project/go.mod
@@ -1,7 +1,3 @@
module go-project
go 1.16
-
-require (
- // Add your dependencies here
-)
\ No newline at end of file
diff --git a/go-project/go.sum b/go-project/go.sum
index 06e0d10..e69de29 100644
--- a/go-project/go.sum
+++ b/go-project/go.sum
@@ -1,7 +0,0 @@
-go: module example.com/go-project
-
-# indirect
-github.com/gin-gonic/gin v1.7.4 // indirect
-github.com/stretchr/testify v1.7.0 // indirect
-golang.org/x/net v0.0.0-20220316182356-1c4e7f4e8b2e // indirect
-golang.org/x/sys v0.0.0-20220316182356-1c4e7f4e8b2e // indirect
\ No newline at end of file
diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod
index 1a12a8b..5d91405 100644
--- a/hugo-docs/go.mod
+++ b/hugo-docs/go.mod
@@ -1,5 +1,3 @@
module github.com/cloudengine-labs/devops_os/hugo-docs
go 1.21.0
-
-require github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 // indirect
diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum
index 2182013..e69de29 100644
--- a/hugo-docs/go.sum
+++ b/hugo-docs/go.sum
@@ -1,2 +0,0 @@
-github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 h1:vwHQ2uXe6gC9kXre7P29AqWYB8Gek5iQTGnJHKBbqDg=
-github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds=
From bb995857ddede3b3e520aacd193d174f1903b54d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 16 Apr 2026 16:24:09 +0000
Subject: [PATCH 7/7] Restore module metadata after Hugo preview update
Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/da764e3f-6ccf-4173-87cc-3bff9ee56e38
Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com>
---
go-project/go.mod | 4 ++++
go-project/go.sum | 7 +++++++
hugo-docs/go.mod | 2 ++
hugo-docs/go.sum | 2 ++
4 files changed, 15 insertions(+)
diff --git a/go-project/go.mod b/go-project/go.mod
index dd04cd6..12b37ce 100644
--- a/go-project/go.mod
+++ b/go-project/go.mod
@@ -1,3 +1,7 @@
module go-project
go 1.16
+
+require (
+ // Add your dependencies here
+)
\ No newline at end of file
diff --git a/go-project/go.sum b/go-project/go.sum
index e69de29..06e0d10 100644
--- a/go-project/go.sum
+++ b/go-project/go.sum
@@ -0,0 +1,7 @@
+go: module example.com/go-project
+
+# indirect
+github.com/gin-gonic/gin v1.7.4 // indirect
+github.com/stretchr/testify v1.7.0 // indirect
+golang.org/x/net v0.0.0-20220316182356-1c4e7f4e8b2e // indirect
+golang.org/x/sys v0.0.0-20220316182356-1c4e7f4e8b2e // indirect
\ No newline at end of file
diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod
index 5d91405..1a12a8b 100644
--- a/hugo-docs/go.mod
+++ b/hugo-docs/go.mod
@@ -1,3 +1,5 @@
module github.com/cloudengine-labs/devops_os/hugo-docs
go 1.21.0
+
+require github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 // indirect
diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum
index e69de29..2182013 100644
--- a/hugo-docs/go.sum
+++ b/hugo-docs/go.sum
@@ -0,0 +1,2 @@
+github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 h1:vwHQ2uXe6gC9kXre7P29AqWYB8Gek5iQTGnJHKBbqDg=
+github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds=