From 828bc484c90f63d696d410752736d36c9b4119cf Mon Sep 17 00:00:00 2001 From: Stephan Lo Date: Thu, 19 Dec 2024 21:52:35 +0100 Subject: [PATCH 01/64] chore(): adjusted frontmatter --- content/en/docs/concepts/5_platforms/CNOE/_index.md | 8 ++++---- content/en/docs/concepts/5_platforms/Humanitec/_index.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/en/docs/concepts/5_platforms/CNOE/_index.md b/content/en/docs/concepts/5_platforms/CNOE/_index.md index dac0b04..4ef49c6 100644 --- a/content/en/docs/concepts/5_platforms/CNOE/_index.md +++ b/content/en/docs/concepts/5_platforms/CNOE/_index.md @@ -1,7 +1,7 @@ -+++ -title = "CNOE" -weight = 4 -+++ +--- +title: CNOE +weight: 4 +--- * https://cnoe.io/docs/intro diff --git a/content/en/docs/concepts/5_platforms/Humanitec/_index.md b/content/en/docs/concepts/5_platforms/Humanitec/_index.md index 21c9e69..07be1b6 100644 --- a/content/en/docs/concepts/5_platforms/Humanitec/_index.md +++ b/content/en/docs/concepts/5_platforms/Humanitec/_index.md @@ -1,7 +1,7 @@ -+++ -title = "Humanitec" -weight = 4 -+++ +--- +title: Humanitec +weight: 4 +--- tbd \ No newline at end of file From 69457ec96426ee7d175ddc38d8f356f9111e6f6c Mon Sep 17 00:00:00 2001 From: Stephan Lo Date: Sat, 25 Oct 2025 09:40:44 +0200 Subject: [PATCH 02/64] feat(build): add automatic npm dependency management - Add deps:ensure-npm task to automatically install npm packages when needed - Configure build, serve, and test tasks to depend on npm dependencies - Use Task's sources/generates/status for intelligent dependency detection - Prevents build failures due to missing PostCSS and other npm packages - Improves developer experience by eliminating manual npm install steps --- Taskfile.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Taskfile.yml b/Taskfile.yml index 5592f19..acf0237 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -13,16 +13,22 @@ tasks: # Build tasks build: desc: Build Hugo site + deps: + - deps:ensure-npm cmds: - "{{.HUGO_CMD}} --gc --minify" build:dev: desc: Build Hugo site for development + deps: + - deps:ensure-npm cmds: - "{{.HUGO_CMD}}" serve: desc: Start Hugo dev server + deps: + - deps:ensure-npm cmds: - "{{.HUGO_CMD}} server" @@ -48,16 +54,22 @@ tasks: test:build: desc: Test Hugo build + deps: + - deps:ensure-npm cmds: - "{{.HUGO_CMD}} --gc --minify --logLevel info" test:markdown: desc: Lint markdown files + deps: + - deps:ensure-npm cmds: - "{{.NPM_CMD}} run test:markdown" test:html: desc: Validate HTML + deps: + - deps:ensure-npm cmds: - "{{.NPM_CMD}} run test:html" @@ -67,6 +79,18 @@ tasks: - htmltest # Development tasks + deps:ensure-npm: + desc: Ensure npm dependencies are installed + sources: + - package.json + - package-lock.json + generates: + - node_modules/.package-lock.json + cmds: + - "{{.NPM_CMD}} install" + status: + - test -d node_modules + deps:install: desc: Install all dependencies cmds: From 1d79ce85a551fa394e05d9be17457b3857504dac Mon Sep 17 00:00:00 2001 From: Stephan Lo Date: Sat, 25 Oct 2025 23:49:48 +0200 Subject: [PATCH 03/64] feat(ui): add git version info display in header - Display current branch/tag and commit hash in navbar center - Show dirty working directory indicator with yellow badge - Add automatic build info generation in Task workflow - Include build timestamp and user information - Style with responsive design (hidden on mobile) - Add .gitignore entries for generated build artifacts --- .gitignore | 6 +++ Taskfile.yml | 14 +++++++ layouts/partials/hooks/head-end.html | 4 ++ layouts/partials/navbar-version.html | 17 ++++++++ layouts/partials/version-info-script.html | 35 +++++++++++++++++ layouts/partials/version-info.html | 36 +++++++++++++++++ scripts/generate-build-info.sh | 48 +++++++++++++++++++++++ static/css/version-info.css | 36 +++++++++++++++++ 8 files changed, 196 insertions(+) create mode 100644 layouts/partials/navbar-version.html create mode 100644 layouts/partials/version-info-script.html create mode 100644 layouts/partials/version-info.html create mode 100755 scripts/generate-build-info.sh create mode 100644 static/css/version-info.css diff --git a/.gitignore b/.gitignore index d6893b7..67fecf1 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,12 @@ tmp/ # devbox .devbox/ +# Task cache +.task/ + +# Generated build data +data/ + # IDE .vscode/ .idea/ diff --git a/Taskfile.yml b/Taskfile.yml index acf0237..02efb4c 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -15,6 +15,7 @@ tasks: desc: Build Hugo site deps: - deps:ensure-npm + - build:generate-info cmds: - "{{.HUGO_CMD}} --gc --minify" @@ -22,13 +23,25 @@ tasks: desc: Build Hugo site for development deps: - deps:ensure-npm + - build:generate-info cmds: - "{{.HUGO_CMD}}" + build:generate-info: + desc: Generate build information (git commit, version, etc.) + sources: + - .git/HEAD + - .git/refs/**/* + generates: + - data/build_info.json + cmds: + - ./scripts/generate-build-info.sh + serve: desc: Start Hugo dev server deps: - deps:ensure-npm + - build:generate-info cmds: - "{{.HUGO_CMD}} server" @@ -56,6 +69,7 @@ tasks: desc: Test Hugo build deps: - deps:ensure-npm + - build:generate-info cmds: - "{{.HUGO_CMD}} --gc --minify --logLevel info" diff --git a/layouts/partials/hooks/head-end.html b/layouts/partials/hooks/head-end.html index 3439ee1..8c62718 100644 --- a/layouts/partials/hooks/head-end.html +++ b/layouts/partials/hooks/head-end.html @@ -3,3 +3,7 @@ {{ end }} + + + +{{ partial "version-info-script.html" . }} diff --git a/layouts/partials/navbar-version.html b/layouts/partials/navbar-version.html new file mode 100644 index 0000000..59a31ca --- /dev/null +++ b/layouts/partials/navbar-version.html @@ -0,0 +1,17 @@ +{{/* Header version info - compact display in navbar */}} +{{ $buildInfo := .Site.Data.build_info }} +{{ if $buildInfo }} + +{{ end }} \ No newline at end of file diff --git a/layouts/partials/version-info-script.html b/layouts/partials/version-info-script.html new file mode 100644 index 0000000..d1724af --- /dev/null +++ b/layouts/partials/version-info-script.html @@ -0,0 +1,35 @@ +{{/* Inline JavaScript to add version info to navbar */}} +{{ $buildInfo := .Site.Data.build_info }} +{{ if $buildInfo }} + +{{ end }} \ No newline at end of file diff --git a/layouts/partials/version-info.html b/layouts/partials/version-info.html new file mode 100644 index 0000000..ac3315e --- /dev/null +++ b/layouts/partials/version-info.html @@ -0,0 +1,36 @@ +{{/* Version info banner - displays git commit info and build time */}} +{{ $buildInfo := .Site.Data.build_info }} +{{ if $buildInfo }} +
+
+
+
+ + + {{ if $buildInfo.git_tag }} + {{ $buildInfo.git_tag }} + {{ if ne $buildInfo.git_tag $buildInfo.git_commit }} + (@{{ $buildInfo.git_commit_short }}) + {{ end }} + {{ else }} + {{ $buildInfo.git_branch }} + @{{ $buildInfo.git_commit_short }} + {{ end }} + {{ if $buildInfo.git_dirty }} + dirty + {{ end }} + +
+
+ + + Built {{ $buildInfo.build_time_human }} + {{ if $buildInfo.build_user }} + by {{ $buildInfo.build_user }} + {{ end }} + +
+
+
+
+{{ end }} \ No newline at end of file diff --git a/scripts/generate-build-info.sh b/scripts/generate-build-info.sh new file mode 100755 index 0000000..a10e2c2 --- /dev/null +++ b/scripts/generate-build-info.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Generate build information for Hugo +# This script collects git information and build metadata + +set -euo pipefail + +# Create data directory if it doesn't exist +mkdir -p data + +# Get git information +GIT_COMMIT=$(git rev-parse HEAD 2>/dev/null || echo "unknown") +GIT_COMMIT_SHORT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") +GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown") +GIT_TAG=$(git describe --tags --exact-match 2>/dev/null || echo "") +GIT_DIRTY="" + +# Check if working directory is dirty +if git diff-index --quiet HEAD -- 2>/dev/null; then + GIT_DIRTY="false" +else + GIT_DIRTY="true" +fi + +# Get build information +BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") +BUILD_TIME_HUMAN=$(date -u +"%Y-%m-%d %H:%M UTC") +BUILD_USER=$(whoami 2>/dev/null || echo "unknown") +BUILD_HOST=$(hostname 2>/dev/null || echo "unknown") + +# Create JSON file for Hugo +cat > data/build_info.json << EOF +{ + "git_commit": "${GIT_COMMIT}", + "git_commit_short": "${GIT_COMMIT_SHORT}", + "git_branch": "${GIT_BRANCH}", + "git_tag": "${GIT_TAG}", + "git_dirty": ${GIT_DIRTY}, + "build_time": "${BUILD_TIME}", + "build_time_human": "${BUILD_TIME_HUMAN}", + "build_user": "${BUILD_USER}", + "build_host": "${BUILD_HOST}" +} +EOF + +echo "✓ Build info generated: data/build_info.json" +echo " Git: ${GIT_BRANCH}@${GIT_COMMIT_SHORT}${GIT_TAG:+ (${GIT_TAG})}" +echo " Built: ${BUILD_TIME_HUMAN} by ${BUILD_USER}" \ No newline at end of file diff --git a/static/css/version-info.css b/static/css/version-info.css new file mode 100644 index 0000000..89c7631 --- /dev/null +++ b/static/css/version-info.css @@ -0,0 +1,36 @@ +/* Navbar version info styles */ +.navbar-version-info { + flex: 1; + justify-content: center; + font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; +} + +.navbar-version-info code { + background: rgba(255, 255, 255, 0.1); + padding: 0.1rem 0.3rem; + border-radius: 0.2rem; + font-size: 0.8rem; +} + +.navbar-version-info .badge { + font-size: 0.6rem; + padding: 0.1rem 0.3rem; +} + +/* Hide on small screens */ +@media (max-width: 767px) { + .navbar-version-info { + display: none !important; + } +} + +/* Additional responsive tweaks */ +@media (min-width: 768px) and (max-width: 991px) { + .navbar-version-info { + flex: 0.5; + } + + .navbar-version-info small { + font-size: 0.75rem; + } +} \ No newline at end of file From 76937ccadfdc67f6e957cb60d26d450999046797 Mon Sep 17 00:00:00 2001 From: Stephan Lo Date: Sat, 25 Oct 2025 23:56:45 +0200 Subject: [PATCH 04/64] feat(search): enable offline search with Lunr.js - Enable offlineSearch = true for client-side search functionality - Disable Google Custom Search to avoid external API dependency - Provides instant search across all documentation content - Works completely offline without server requirements --- hugo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hugo.toml b/hugo.toml index 234c0c0..9b98038 100644 --- a/hugo.toml +++ b/hugo.toml @@ -112,10 +112,10 @@ url_latest_version = "https://example.com" github_branch= "main" # Google Custom Search Engine ID. Remove or comment out to disable search. -gcs_engine_id = "d72aa9b2712488cc3" +# gcs_engine_id = "d72aa9b2712488cc3" # Enable Lunr.js offline search -offlineSearch = false +offlineSearch = true # Enable syntax highlighting and copy buttons on code blocks with Prism prism_syntax_highlighting = false From 3239cfbc62e8bc80b03c9570e5418fcfbcb45433 Mon Sep 17 00:00:00 2001 From: Stephan Lo Date: Fri, 7 Nov 2025 11:50:17 +0100 Subject: [PATCH 05/64] refactor(architecture): reorganize LikeC4 projects and consolidate webcomponents Renamed resources/likec4 to resources/edp-likec4 to better reflect that this directory contains the Enterprise Developer Platform architecture models, not documentation platform architecture. Extended element kinds in edp-likec4/models/spec.c4 to support documentation platform modeling: - Added person, tool, process, repository element kinds - These allow modeling of documentation workflows and processes Consolidated webcomponent generation: - Combined both architecture projects (edp-likec4 and doc-likec4) into a single webcomponent output at static/js/likec4-webcomponent.js - Updated Taskfile.yml to generate from edp-likec4 directory - Removed duplicate webcomponent script loading in head-end.html - Fixed CustomElementRegistry duplicate registration issue Embedded TeleNeoOffice corporate fonts: - Added font files to static/fonts/ and static/ root - Required for correct rendering of diagrams in webcomponent - Fonts are embedded in webcomponent but also served from Hugo static paths - Fixed 404 errors for font loading Updated architecture documentation: - Fixed markdown linting issues (trailing spaces, fence spacing) - Updated all references from resources/likec4 to resources/edp-likec4 - Enhanced setup.md with correct directory structure This refactoring enables: 1. Clear separation between EDP architecture and documentation platform models 2. Single consolidated webcomponent containing all architecture views 3. Proper font loading for corporate branding in diagrams 4. Foundation for future architecture documentation expansion Breaking changes: None (paths updated in documentation) --- Taskfile.yml | 6 + content/en/docs/architecture/highlevelarch.md | 10 +- content/en/docs/architecture/setup.md | 32 +- layouts/partials/hooks/head-end.html | 1 + .../{likec4 => edp-likec4}/INTEGRATION.md | 0 resources/{likec4 => edp-likec4}/README.md | 11 +- .../deployment/kind/edp.c4 | 0 .../deployment/otc/edp.c4 | 0 .../deployment/otc/faas-deployment.c4 | 14 + .../deployment/otc/foundry.c4 | 0 resources/{likec4 => edp-likec4}/devbox.json | 0 resources/{likec4 => edp-likec4}/devbox.lock | 0 .../developer-landscape/cicd-outerloop-2.png | Bin .../cicd-outerloop-draft.png | Bin .../developer-landscape/cicd-outerloop.png | Bin .../devday-presentation.md | 0 .../developer-landscape-view-c4-2.png | Bin ...er-landscape-view-c4-ppt-layouted-dark.png | Bin ...veloper-landscape-view-c4-ppt-layouted.png | Bin .../developer-landscape-view-c4.png | Bin .../developer-landscape-view-draft.png | Bin .../doc/developer-landscape/localdev.png | Bin .../doc/developer-landscape/slide-1.png | Bin .../{likec4 => edp-likec4}/likec4.config.json | 0 .../models/code/workflow-edpbuilder.c4 | 0 .../models/code/workflow-setup-edp-argocd.c4 | 0 .../code/workflow-setup-edp-infrastructure.c4 | 0 .../components/application-specification.c4 | 0 .../models/components/forgejoRunner.c4 | 0 .../models/components/forgejoRunnerWorker.c4 | 0 .../models/components/promtail.c4 | 0 .../models/components/tools.c4 | 0 .../models/containers/api.c4 | 0 .../models/containers/argocd.c4 | 0 .../models/containers/backstage.c4 | 0 .../models/containers/crossplane.c4 | 0 .../models/containers/elasticsearch.c4 | 0 .../models/containers/externalsecrets.c4 | 0 .../models/containers/forgejo.c4 | 0 .../models/containers/grafana.c4 | 0 .../models/containers/ingress.c4 | 0 .../models/containers/keycloak.c4 | 0 .../models/containers/kyverno.c4 | 0 .../models/containers/loki.c4 | 0 .../models/containers/mailhog.c4 | 0 .../models/containers/minio.c4 | 0 .../models/containers/monitoring.c4 | 0 .../models/containers/objectstorage.c4 | 0 .../models/containers/openbao.c4 | 0 .../models/containers/postgres.c4 | 0 .../models/containers/prometheus.c4 | 0 .../models/containers/redis.c4 | 0 .../models/containers/spark-operator.c4 | 0 .../models/containers/velero.c4 | 0 .../models/context/actors.c4 | 0 .../models/context/cloud.c4 | 0 .../models/context/customer-systems.c4 | 0 .../models/context/edfoundry.c4 | 0 .../models/context/edp.c4 | 0 .../models/context/localbox.c4 | 0 .../doc-platform/documentation-platform.c4 | 336 ++++++++++++++++++ .../{likec4 => edp-likec4}/models/spec.c4 | 13 + .../{likec4 => edp-likec4}/package-lock.json | 0 resources/{likec4 => edp-likec4}/package.json | 0 .../views/deployment/kind/kind.c4 | 0 .../views/deployment/otc/edp.c4 | 0 .../otc/forgejo-runner-connections.md | 0 .../views/deployment/otc/foundry-and-edp.c4 | 0 .../views/deployment/otc/foundry.c4 | 0 .../views/deployment/otc/otc-faas.c4 | 0 .../dynamic/cicd/gitops-inner-outer-loop.c4 | 0 .../views/edp/edfbuilder.c4 | 0 .../views/edp/edp-as-idp.c4 | 0 .../views/edp/edp-as-orchestrator.c4 | 0 .../{likec4 => edp-likec4}/views/edp/edp.c4 | 0 .../application-transition.c4 | 0 .../developer-landscape-with-foundry.c4 | 0 .../platform-context/developer-landscape.c4 | 0 static/TeleNeoOffice-Bold.a7bb592b.ttf | 1 + static/TeleNeoOffice-ExtraBold.fbe9fe42.ttf | 1 + static/TeleNeoOffice-Medium.79fb426d.ttf | 1 + static/TeleNeoOffice-Regular.b0a2cff1.ttf | 1 + static/TeleNeoOffice-Thin.53627df9.ttf | 1 + static/fonts/TeleNeoOffice-Bold.a7bb592b.ttf | Bin 0 -> 224276 bytes .../TeleNeoOffice-ExtraBold.fbe9fe42.ttf | Bin 0 -> 223092 bytes .../fonts/TeleNeoOffice-Medium.79fb426d.ttf | Bin 0 -> 224476 bytes .../fonts/TeleNeoOffice-Regular.b0a2cff1.ttf | Bin 0 -> 214572 bytes static/fonts/TeleNeoOffice-Thin.53627df9.ttf | Bin 0 -> 203064 bytes static/js/likec4-webcomponent.js | 222 ++++++------ 89 files changed, 520 insertions(+), 130 deletions(-) rename resources/{likec4 => edp-likec4}/INTEGRATION.md (100%) rename resources/{likec4 => edp-likec4}/README.md (70%) rename resources/{likec4 => edp-likec4}/deployment/kind/edp.c4 (100%) rename resources/{likec4 => edp-likec4}/deployment/otc/edp.c4 (100%) rename resources/{likec4 => edp-likec4}/deployment/otc/faas-deployment.c4 (83%) rename resources/{likec4 => edp-likec4}/deployment/otc/foundry.c4 (100%) rename resources/{likec4 => edp-likec4}/devbox.json (100%) rename resources/{likec4 => edp-likec4}/devbox.lock (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/cicd-outerloop-2.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/cicd-outerloop-draft.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/cicd-outerloop.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/devday-presentation.md (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/developer-landscape-view-c4-2.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted-dark.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/developer-landscape-view-c4.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/developer-landscape-view-draft.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/localdev.png (100%) rename resources/{likec4 => edp-likec4}/doc/developer-landscape/slide-1.png (100%) rename resources/{likec4 => edp-likec4}/likec4.config.json (100%) rename resources/{likec4 => edp-likec4}/models/code/workflow-edpbuilder.c4 (100%) rename resources/{likec4 => edp-likec4}/models/code/workflow-setup-edp-argocd.c4 (100%) rename resources/{likec4 => edp-likec4}/models/code/workflow-setup-edp-infrastructure.c4 (100%) rename resources/{likec4 => edp-likec4}/models/components/application-specification.c4 (100%) rename resources/{likec4 => edp-likec4}/models/components/forgejoRunner.c4 (100%) rename resources/{likec4 => edp-likec4}/models/components/forgejoRunnerWorker.c4 (100%) rename resources/{likec4 => edp-likec4}/models/components/promtail.c4 (100%) rename resources/{likec4 => edp-likec4}/models/components/tools.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/api.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/argocd.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/backstage.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/crossplane.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/elasticsearch.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/externalsecrets.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/forgejo.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/grafana.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/ingress.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/keycloak.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/kyverno.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/loki.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/mailhog.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/minio.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/monitoring.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/objectstorage.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/openbao.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/postgres.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/prometheus.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/redis.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/spark-operator.c4 (100%) rename resources/{likec4 => edp-likec4}/models/containers/velero.c4 (100%) rename resources/{likec4 => edp-likec4}/models/context/actors.c4 (100%) rename resources/{likec4 => edp-likec4}/models/context/cloud.c4 (100%) rename resources/{likec4 => edp-likec4}/models/context/customer-systems.c4 (100%) rename resources/{likec4 => edp-likec4}/models/context/edfoundry.c4 (100%) rename resources/{likec4 => edp-likec4}/models/context/edp.c4 (100%) rename resources/{likec4 => edp-likec4}/models/context/localbox.c4 (100%) create mode 100644 resources/edp-likec4/models/doc-platform/documentation-platform.c4 rename resources/{likec4 => edp-likec4}/models/spec.c4 (73%) rename resources/{likec4 => edp-likec4}/package-lock.json (100%) rename resources/{likec4 => edp-likec4}/package.json (100%) rename resources/{likec4 => edp-likec4}/views/deployment/kind/kind.c4 (100%) rename resources/{likec4 => edp-likec4}/views/deployment/otc/edp.c4 (100%) rename resources/{likec4 => edp-likec4}/views/deployment/otc/forgejo-runner-connections.md (100%) rename resources/{likec4 => edp-likec4}/views/deployment/otc/foundry-and-edp.c4 (100%) rename resources/{likec4 => edp-likec4}/views/deployment/otc/foundry.c4 (100%) rename resources/{likec4 => edp-likec4}/views/deployment/otc/otc-faas.c4 (100%) rename resources/{likec4 => edp-likec4}/views/dynamic/cicd/gitops-inner-outer-loop.c4 (100%) rename resources/{likec4 => edp-likec4}/views/edp/edfbuilder.c4 (100%) rename resources/{likec4 => edp-likec4}/views/edp/edp-as-idp.c4 (100%) rename resources/{likec4 => edp-likec4}/views/edp/edp-as-orchestrator.c4 (100%) rename resources/{likec4 => edp-likec4}/views/edp/edp.c4 (100%) rename resources/{likec4 => edp-likec4}/views/high-level-concept/application-transition.c4 (100%) rename resources/{likec4 => edp-likec4}/views/high-level-concept/platform-context/developer-landscape-with-foundry.c4 (100%) rename resources/{likec4 => edp-likec4}/views/high-level-concept/platform-context/developer-landscape.c4 (100%) create mode 120000 static/TeleNeoOffice-Bold.a7bb592b.ttf create mode 120000 static/TeleNeoOffice-ExtraBold.fbe9fe42.ttf create mode 120000 static/TeleNeoOffice-Medium.79fb426d.ttf create mode 120000 static/TeleNeoOffice-Regular.b0a2cff1.ttf create mode 120000 static/TeleNeoOffice-Thin.53627df9.ttf create mode 100644 static/fonts/TeleNeoOffice-Bold.a7bb592b.ttf create mode 100644 static/fonts/TeleNeoOffice-ExtraBold.fbe9fe42.ttf create mode 100644 static/fonts/TeleNeoOffice-Medium.79fb426d.ttf create mode 100644 static/fonts/TeleNeoOffice-Regular.b0a2cff1.ttf create mode 100644 static/fonts/TeleNeoOffice-Thin.53627df9.ttf diff --git a/Taskfile.yml b/Taskfile.yml index 02efb4c..454fb0c 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -92,6 +92,12 @@ tasks: cmds: - htmltest + # LikeC4 tasks + likec4:generate: + desc: Generate LikeC4 webcomponent (includes all architecture projects) + cmds: + - cd resources/edp-likec4 && npx likec4 codegen webcomponent --webcomponent-prefix likec4 --outfile ../../static/js/likec4-webcomponent.js + # Development tasks deps:ensure-npm: desc: Ensure npm dependencies are installed diff --git a/content/en/docs/architecture/highlevelarch.md b/content/en/docs/architecture/highlevelarch.md index bc35440..757cb2d 100644 --- a/content/en/docs/architecture/highlevelarch.md +++ b/content/en/docs/architecture/highlevelarch.md @@ -25,12 +25,12 @@ This document describes the high-level architecture of our Enterprise Developmen document.addEventListener('DOMContentLoaded', function() { let attempts = 0; const maxAttempts = 10; - + function checkLikeC4Loading() { attempts++; const component = document.querySelector('likec4-view'); const loading = document.getElementById('likec4-loading'); - + if (component && component.shadowRoot && component.shadowRoot.children.length > 0) { if (loading) loading.style.display = 'none'; console.log('LikeC4 component loaded successfully'); @@ -44,7 +44,7 @@ document.addEventListener('DOMContentLoaded', function() { setTimeout(checkLikeC4Loading, 1000); } } - + // Check if LikeC4 loader is available if (typeof window.customElements !== 'undefined') { setTimeout(checkLikeC4Loading, 1500); @@ -110,11 +110,11 @@ The interactive diagram above shows the relationships between different componen To update or modify the architecture diagrams: -1. Edit the `.c4` files in `resources/likec4/` +1. Edit the `.c4` files in `resources/edp-likec4/` 2. Regenerate the webcomponent: ```bash - cd resources/likec4 + cd resources/edp-likec4 npx likec4 codegen webcomponent \ --webcomponent-prefix likec4 \ --outfile ../../static/js/likec4-webcomponent.js diff --git a/content/en/docs/architecture/setup.md b/content/en/docs/architecture/setup.md index cc5a69d..ef6a948 100644 --- a/content/en/docs/architecture/setup.md +++ b/content/en/docs/architecture/setup.md @@ -24,7 +24,7 @@ LikeC4 enables you to create interactive C4 architecture diagrams as code. The d Navigate to the LikeC4 directory and install dependencies: ```bash -cd resources/likec4 +cd resources/edp-likec4 npm install ``` @@ -39,6 +39,7 @@ npx likec4 codegen webcomponent \ ``` This command: + - Reads all `.c4` files from `models/` and `views/` - Generates a single JavaScript file with all architecture views - Outputs to `static/js/likec4-webcomponent.js` @@ -54,8 +55,8 @@ The integration should already be configured in: ## Directory Structure -``` -resources/likec4/ +```plaintext +resources/edp-likec4/ ├── models/ # C4 model definitions │ ├── components/ # Component models │ ├── containers/ # Container models @@ -93,11 +94,12 @@ Add this to any Markdown file: To find available view IDs, search the `.c4` files: ```bash -cd resources/likec4 +cd resources/edp-likec4 grep -r "view\s\+\w" views/ models/ --include="*.c4" ``` Common views: + - `otc-faas` - OTC FaaS deployment - `edp` - EDP overview - `landscape` - Developer landscape @@ -128,14 +130,14 @@ Click on components in the diagram to explore the architecture. ### 1. Modify Architecture Models -Edit the `.c4` files in `resources/likec4/`: +Edit the `.c4` files in `resources/edp-likec4/`: ```bash # Edit a model -vi resources/likec4/models/containers/argocd.c4 +vi resources/edp-likec4/models/containers/argocd.c4 # Or edit a view -vi resources/likec4/views/deployment/otc/otc-faas.c4 +vi resources/edp-likec4/views/deployment/otc/otc-faas.c4 ``` ### 2. Preview Changes Locally @@ -143,7 +145,7 @@ vi resources/likec4/views/deployment/otc/otc-faas.c4 Use the LikeC4 CLI to preview: ```bash -cd resources/likec4 +cd resources/edp-likec4 # Start preview server npx likec4 start @@ -156,7 +158,7 @@ npx likec4 start After making changes: ```bash -cd resources/likec4 +cd resources/edp-likec4 npx likec4 codegen webcomponent \ --webcomponent-prefix likec4 \ --outfile ../../static/js/likec4-webcomponent.js @@ -178,7 +180,7 @@ hugo server -D Commit both the model files and the regenerated web component: ```bash -git add resources/likec4/ +git add resources/edp-likec4/ git add static/js/likec4-webcomponent.js git commit -m "feat: update architecture diagrams" ``` @@ -242,12 +244,15 @@ Then update `layouts/partials/hooks/head-end.html`: 1. **Check browser console** (F12 → Console) 2. **Verify webcomponent exists:** + ```bash ls -lh static/js/likec4-webcomponent.js ``` + 3. **Regenerate if missing:** + ```bash - cd resources/likec4 + cd resources/edp-likec4 npm install npx likec4 codegen webcomponent \ --webcomponent-prefix likec4 \ @@ -258,8 +263,9 @@ Then update `layouts/partials/hooks/head-end.html`: - Check view ID matches exactly (case-sensitive) - Search for the view in `.c4` files: + ```bash - grep -r "view otc-faas" resources/likec4/ + grep -r "view otc-faas" resources/edp-likec4/ ``` ### Styling Issues @@ -272,7 +278,7 @@ Then update `layouts/partials/hooks/head-end.html`: If LikeC4 codegen fails: ```bash -cd resources/likec4 +cd resources/edp-likec4 rm -rf node_modules package-lock.json npm install ``` diff --git a/layouts/partials/hooks/head-end.html b/layouts/partials/hooks/head-end.html index 8c62718..6968af4 100644 --- a/layouts/partials/hooks/head-end.html +++ b/layouts/partials/hooks/head-end.html @@ -2,6 +2,7 @@ + {{ end }} diff --git a/resources/likec4/INTEGRATION.md b/resources/edp-likec4/INTEGRATION.md similarity index 100% rename from resources/likec4/INTEGRATION.md rename to resources/edp-likec4/INTEGRATION.md diff --git a/resources/likec4/README.md b/resources/edp-likec4/README.md similarity index 70% rename from resources/likec4/README.md rename to resources/edp-likec4/README.md index cc88733..f567446 100644 --- a/resources/likec4/README.md +++ b/resources/edp-likec4/README.md @@ -1,4 +1,13 @@ -# LikeC4 architecture documentation +# LikeC4 Architecture Documentation - EDP Platform + +This folder contains LikeC4 architecture models for the **Enterprise Developer Platform (EDP)**. + +## Purpose + +These models document the platform architecture, not the documentation system itself. +(For documentation platform architecture, see `resources/doc-likec4/`) + +## Usage Run `npx likec4 start` to start dev server diff --git a/resources/likec4/deployment/kind/edp.c4 b/resources/edp-likec4/deployment/kind/edp.c4 similarity index 100% rename from resources/likec4/deployment/kind/edp.c4 rename to resources/edp-likec4/deployment/kind/edp.c4 diff --git a/resources/likec4/deployment/otc/edp.c4 b/resources/edp-likec4/deployment/otc/edp.c4 similarity index 100% rename from resources/likec4/deployment/otc/edp.c4 rename to resources/edp-likec4/deployment/otc/edp.c4 diff --git a/resources/likec4/deployment/otc/faas-deployment.c4 b/resources/edp-likec4/deployment/otc/faas-deployment.c4 similarity index 83% rename from resources/likec4/deployment/otc/faas-deployment.c4 rename to resources/edp-likec4/deployment/otc/faas-deployment.c4 index 7d482ef..21f9fa2 100644 --- a/resources/likec4/deployment/otc/faas-deployment.c4 +++ b/resources/edp-likec4/deployment/otc/faas-deployment.c4 @@ -69,4 +69,18 @@ deployment { } + cloud edge 'Edge Cloud' { + description 'Edge environments for distributed workloads.' + technology 'Edge' + + environment edge-dev 'Edge Dev' { + description 'Edge development environment' + technology 'Edge' + } + + environment edge-prod 'Edge Prod' { + description 'Edge production environment' + technology 'Edge' + } + } } \ No newline at end of file diff --git a/resources/likec4/deployment/otc/foundry.c4 b/resources/edp-likec4/deployment/otc/foundry.c4 similarity index 100% rename from resources/likec4/deployment/otc/foundry.c4 rename to resources/edp-likec4/deployment/otc/foundry.c4 diff --git a/resources/likec4/devbox.json b/resources/edp-likec4/devbox.json similarity index 100% rename from resources/likec4/devbox.json rename to resources/edp-likec4/devbox.json diff --git a/resources/likec4/devbox.lock b/resources/edp-likec4/devbox.lock similarity index 100% rename from resources/likec4/devbox.lock rename to resources/edp-likec4/devbox.lock diff --git a/resources/likec4/doc/developer-landscape/cicd-outerloop-2.png b/resources/edp-likec4/doc/developer-landscape/cicd-outerloop-2.png similarity index 100% rename from resources/likec4/doc/developer-landscape/cicd-outerloop-2.png rename to resources/edp-likec4/doc/developer-landscape/cicd-outerloop-2.png diff --git a/resources/likec4/doc/developer-landscape/cicd-outerloop-draft.png b/resources/edp-likec4/doc/developer-landscape/cicd-outerloop-draft.png similarity index 100% rename from resources/likec4/doc/developer-landscape/cicd-outerloop-draft.png rename to resources/edp-likec4/doc/developer-landscape/cicd-outerloop-draft.png diff --git a/resources/likec4/doc/developer-landscape/cicd-outerloop.png b/resources/edp-likec4/doc/developer-landscape/cicd-outerloop.png similarity index 100% rename from resources/likec4/doc/developer-landscape/cicd-outerloop.png rename to resources/edp-likec4/doc/developer-landscape/cicd-outerloop.png diff --git a/resources/likec4/doc/developer-landscape/devday-presentation.md b/resources/edp-likec4/doc/developer-landscape/devday-presentation.md similarity index 100% rename from resources/likec4/doc/developer-landscape/devday-presentation.md rename to resources/edp-likec4/doc/developer-landscape/devday-presentation.md diff --git a/resources/likec4/doc/developer-landscape/developer-landscape-view-c4-2.png b/resources/edp-likec4/doc/developer-landscape/developer-landscape-view-c4-2.png similarity index 100% rename from resources/likec4/doc/developer-landscape/developer-landscape-view-c4-2.png rename to resources/edp-likec4/doc/developer-landscape/developer-landscape-view-c4-2.png diff --git a/resources/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted-dark.png b/resources/edp-likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted-dark.png similarity index 100% rename from resources/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted-dark.png rename to resources/edp-likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted-dark.png diff --git a/resources/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted.png b/resources/edp-likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted.png similarity index 100% rename from resources/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted.png rename to resources/edp-likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted.png diff --git a/resources/likec4/doc/developer-landscape/developer-landscape-view-c4.png b/resources/edp-likec4/doc/developer-landscape/developer-landscape-view-c4.png similarity index 100% rename from resources/likec4/doc/developer-landscape/developer-landscape-view-c4.png rename to resources/edp-likec4/doc/developer-landscape/developer-landscape-view-c4.png diff --git a/resources/likec4/doc/developer-landscape/developer-landscape-view-draft.png b/resources/edp-likec4/doc/developer-landscape/developer-landscape-view-draft.png similarity index 100% rename from resources/likec4/doc/developer-landscape/developer-landscape-view-draft.png rename to resources/edp-likec4/doc/developer-landscape/developer-landscape-view-draft.png diff --git a/resources/likec4/doc/developer-landscape/localdev.png b/resources/edp-likec4/doc/developer-landscape/localdev.png similarity index 100% rename from resources/likec4/doc/developer-landscape/localdev.png rename to resources/edp-likec4/doc/developer-landscape/localdev.png diff --git a/resources/likec4/doc/developer-landscape/slide-1.png b/resources/edp-likec4/doc/developer-landscape/slide-1.png similarity index 100% rename from resources/likec4/doc/developer-landscape/slide-1.png rename to resources/edp-likec4/doc/developer-landscape/slide-1.png diff --git a/resources/likec4/likec4.config.json b/resources/edp-likec4/likec4.config.json similarity index 100% rename from resources/likec4/likec4.config.json rename to resources/edp-likec4/likec4.config.json diff --git a/resources/likec4/models/code/workflow-edpbuilder.c4 b/resources/edp-likec4/models/code/workflow-edpbuilder.c4 similarity index 100% rename from resources/likec4/models/code/workflow-edpbuilder.c4 rename to resources/edp-likec4/models/code/workflow-edpbuilder.c4 diff --git a/resources/likec4/models/code/workflow-setup-edp-argocd.c4 b/resources/edp-likec4/models/code/workflow-setup-edp-argocd.c4 similarity index 100% rename from resources/likec4/models/code/workflow-setup-edp-argocd.c4 rename to resources/edp-likec4/models/code/workflow-setup-edp-argocd.c4 diff --git a/resources/likec4/models/code/workflow-setup-edp-infrastructure.c4 b/resources/edp-likec4/models/code/workflow-setup-edp-infrastructure.c4 similarity index 100% rename from resources/likec4/models/code/workflow-setup-edp-infrastructure.c4 rename to resources/edp-likec4/models/code/workflow-setup-edp-infrastructure.c4 diff --git a/resources/likec4/models/components/application-specification.c4 b/resources/edp-likec4/models/components/application-specification.c4 similarity index 100% rename from resources/likec4/models/components/application-specification.c4 rename to resources/edp-likec4/models/components/application-specification.c4 diff --git a/resources/likec4/models/components/forgejoRunner.c4 b/resources/edp-likec4/models/components/forgejoRunner.c4 similarity index 100% rename from resources/likec4/models/components/forgejoRunner.c4 rename to resources/edp-likec4/models/components/forgejoRunner.c4 diff --git a/resources/likec4/models/components/forgejoRunnerWorker.c4 b/resources/edp-likec4/models/components/forgejoRunnerWorker.c4 similarity index 100% rename from resources/likec4/models/components/forgejoRunnerWorker.c4 rename to resources/edp-likec4/models/components/forgejoRunnerWorker.c4 diff --git a/resources/likec4/models/components/promtail.c4 b/resources/edp-likec4/models/components/promtail.c4 similarity index 100% rename from resources/likec4/models/components/promtail.c4 rename to resources/edp-likec4/models/components/promtail.c4 diff --git a/resources/likec4/models/components/tools.c4 b/resources/edp-likec4/models/components/tools.c4 similarity index 100% rename from resources/likec4/models/components/tools.c4 rename to resources/edp-likec4/models/components/tools.c4 diff --git a/resources/likec4/models/containers/api.c4 b/resources/edp-likec4/models/containers/api.c4 similarity index 100% rename from resources/likec4/models/containers/api.c4 rename to resources/edp-likec4/models/containers/api.c4 diff --git a/resources/likec4/models/containers/argocd.c4 b/resources/edp-likec4/models/containers/argocd.c4 similarity index 100% rename from resources/likec4/models/containers/argocd.c4 rename to resources/edp-likec4/models/containers/argocd.c4 diff --git a/resources/likec4/models/containers/backstage.c4 b/resources/edp-likec4/models/containers/backstage.c4 similarity index 100% rename from resources/likec4/models/containers/backstage.c4 rename to resources/edp-likec4/models/containers/backstage.c4 diff --git a/resources/likec4/models/containers/crossplane.c4 b/resources/edp-likec4/models/containers/crossplane.c4 similarity index 100% rename from resources/likec4/models/containers/crossplane.c4 rename to resources/edp-likec4/models/containers/crossplane.c4 diff --git a/resources/likec4/models/containers/elasticsearch.c4 b/resources/edp-likec4/models/containers/elasticsearch.c4 similarity index 100% rename from resources/likec4/models/containers/elasticsearch.c4 rename to resources/edp-likec4/models/containers/elasticsearch.c4 diff --git a/resources/likec4/models/containers/externalsecrets.c4 b/resources/edp-likec4/models/containers/externalsecrets.c4 similarity index 100% rename from resources/likec4/models/containers/externalsecrets.c4 rename to resources/edp-likec4/models/containers/externalsecrets.c4 diff --git a/resources/likec4/models/containers/forgejo.c4 b/resources/edp-likec4/models/containers/forgejo.c4 similarity index 100% rename from resources/likec4/models/containers/forgejo.c4 rename to resources/edp-likec4/models/containers/forgejo.c4 diff --git a/resources/likec4/models/containers/grafana.c4 b/resources/edp-likec4/models/containers/grafana.c4 similarity index 100% rename from resources/likec4/models/containers/grafana.c4 rename to resources/edp-likec4/models/containers/grafana.c4 diff --git a/resources/likec4/models/containers/ingress.c4 b/resources/edp-likec4/models/containers/ingress.c4 similarity index 100% rename from resources/likec4/models/containers/ingress.c4 rename to resources/edp-likec4/models/containers/ingress.c4 diff --git a/resources/likec4/models/containers/keycloak.c4 b/resources/edp-likec4/models/containers/keycloak.c4 similarity index 100% rename from resources/likec4/models/containers/keycloak.c4 rename to resources/edp-likec4/models/containers/keycloak.c4 diff --git a/resources/likec4/models/containers/kyverno.c4 b/resources/edp-likec4/models/containers/kyverno.c4 similarity index 100% rename from resources/likec4/models/containers/kyverno.c4 rename to resources/edp-likec4/models/containers/kyverno.c4 diff --git a/resources/likec4/models/containers/loki.c4 b/resources/edp-likec4/models/containers/loki.c4 similarity index 100% rename from resources/likec4/models/containers/loki.c4 rename to resources/edp-likec4/models/containers/loki.c4 diff --git a/resources/likec4/models/containers/mailhog.c4 b/resources/edp-likec4/models/containers/mailhog.c4 similarity index 100% rename from resources/likec4/models/containers/mailhog.c4 rename to resources/edp-likec4/models/containers/mailhog.c4 diff --git a/resources/likec4/models/containers/minio.c4 b/resources/edp-likec4/models/containers/minio.c4 similarity index 100% rename from resources/likec4/models/containers/minio.c4 rename to resources/edp-likec4/models/containers/minio.c4 diff --git a/resources/likec4/models/containers/monitoring.c4 b/resources/edp-likec4/models/containers/monitoring.c4 similarity index 100% rename from resources/likec4/models/containers/monitoring.c4 rename to resources/edp-likec4/models/containers/monitoring.c4 diff --git a/resources/likec4/models/containers/objectstorage.c4 b/resources/edp-likec4/models/containers/objectstorage.c4 similarity index 100% rename from resources/likec4/models/containers/objectstorage.c4 rename to resources/edp-likec4/models/containers/objectstorage.c4 diff --git a/resources/likec4/models/containers/openbao.c4 b/resources/edp-likec4/models/containers/openbao.c4 similarity index 100% rename from resources/likec4/models/containers/openbao.c4 rename to resources/edp-likec4/models/containers/openbao.c4 diff --git a/resources/likec4/models/containers/postgres.c4 b/resources/edp-likec4/models/containers/postgres.c4 similarity index 100% rename from resources/likec4/models/containers/postgres.c4 rename to resources/edp-likec4/models/containers/postgres.c4 diff --git a/resources/likec4/models/containers/prometheus.c4 b/resources/edp-likec4/models/containers/prometheus.c4 similarity index 100% rename from resources/likec4/models/containers/prometheus.c4 rename to resources/edp-likec4/models/containers/prometheus.c4 diff --git a/resources/likec4/models/containers/redis.c4 b/resources/edp-likec4/models/containers/redis.c4 similarity index 100% rename from resources/likec4/models/containers/redis.c4 rename to resources/edp-likec4/models/containers/redis.c4 diff --git a/resources/likec4/models/containers/spark-operator.c4 b/resources/edp-likec4/models/containers/spark-operator.c4 similarity index 100% rename from resources/likec4/models/containers/spark-operator.c4 rename to resources/edp-likec4/models/containers/spark-operator.c4 diff --git a/resources/likec4/models/containers/velero.c4 b/resources/edp-likec4/models/containers/velero.c4 similarity index 100% rename from resources/likec4/models/containers/velero.c4 rename to resources/edp-likec4/models/containers/velero.c4 diff --git a/resources/likec4/models/context/actors.c4 b/resources/edp-likec4/models/context/actors.c4 similarity index 100% rename from resources/likec4/models/context/actors.c4 rename to resources/edp-likec4/models/context/actors.c4 diff --git a/resources/likec4/models/context/cloud.c4 b/resources/edp-likec4/models/context/cloud.c4 similarity index 100% rename from resources/likec4/models/context/cloud.c4 rename to resources/edp-likec4/models/context/cloud.c4 diff --git a/resources/likec4/models/context/customer-systems.c4 b/resources/edp-likec4/models/context/customer-systems.c4 similarity index 100% rename from resources/likec4/models/context/customer-systems.c4 rename to resources/edp-likec4/models/context/customer-systems.c4 diff --git a/resources/likec4/models/context/edfoundry.c4 b/resources/edp-likec4/models/context/edfoundry.c4 similarity index 100% rename from resources/likec4/models/context/edfoundry.c4 rename to resources/edp-likec4/models/context/edfoundry.c4 diff --git a/resources/likec4/models/context/edp.c4 b/resources/edp-likec4/models/context/edp.c4 similarity index 100% rename from resources/likec4/models/context/edp.c4 rename to resources/edp-likec4/models/context/edp.c4 diff --git a/resources/likec4/models/context/localbox.c4 b/resources/edp-likec4/models/context/localbox.c4 similarity index 100% rename from resources/likec4/models/context/localbox.c4 rename to resources/edp-likec4/models/context/localbox.c4 diff --git a/resources/edp-likec4/models/doc-platform/documentation-platform.c4 b/resources/edp-likec4/models/doc-platform/documentation-platform.c4 new file mode 100644 index 0000000..44a089c --- /dev/null +++ b/resources/edp-likec4/models/doc-platform/documentation-platform.c4 @@ -0,0 +1,336 @@ +// Documentation Platform Architecture Model +// This model describes the Hugo-based documentation platform + +model { + +// === Personas === +documentor = person 'Documentor' { + description 'Content creator and maintainer of the developer platform documentation' + technology 'Hugo, Markdown, LikeC4' +} + +// === Documentation Platform System === +docPlatform = system 'Documentation Platform' { + description 'Hugo-based documentation system with integrated architecture visualization' + + // Core Components + hugoSite = component 'Hugo Site' { + description 'Static site generator based on Hugo with Docsy theme' + technology 'Hugo Extended, Docsy' + } + + contentRepo = repository 'Content Repository' { + description 'Markdown files, images, and configuration' + technology 'Git, Markdown' + + contentPages = component 'Content Pages' { + description 'Documentation pages in Markdown format' + technology 'Markdown' + } + + archModels = component 'Architecture Models' { + description 'LikeC4 architecture models and views' + technology 'LikeC4 DSL' + } + + assets = component 'Static Assets' { + description 'CSS, JavaScript, images, fonts' + technology 'CSS, JavaScript' + } + } + + likec4Integration = component 'LikeC4 Integration' { + description 'Architecture diagram visualization embedded in documentation' + technology 'LikeC4, Web Components' + } + + // Build & Development Tools + taskfile = tool 'Taskfile' { + description 'Task automation for local development, build, and testing' + technology 'Task (go-task)' + } + + devServer = process 'Development Server' { + description 'Local Hugo server with hot reload for content development' + technology 'Hugo Server' + } +} + +// === CI/CD Pipeline === +cicdPipeline = system 'CI/CD Pipeline' { + description 'Automated testing and deployment pipeline' + + githubActions = process 'GitHub Actions' { + description 'Automated testing workflow on push/PR' + technology 'GitHub Actions' + + testBuild = component 'Build Test' { + description 'Hugo build validation' + technology 'Hugo' + } + + testMarkdown = component 'Markdown Lint' { + description 'Markdown syntax and style checking' + technology 'markdownlint' + } + + testHtml = component 'HTML Validation' { + description 'Generated HTML validation' + technology 'htmlvalidate' + } + + testLinks = component 'Link Checker' { + description 'Broken link detection' + technology 'htmltest' + } + } + + containerBuild = process 'Container Build' { + description 'OCI/Docker image creation with Hugo site' + technology 'Docker' + } +} + +// === Deployment === +deploymentEnv = system 'Deployment Environment' { + description 'Edge deployment infrastructure' + + edgeConnect = system 'Edge Connect' { + description 'Edge deployment orchestration platform' + technology 'EdgeConnect' + } + + k8sCluster = system 'Kubernetes Cluster' { + description 'K8s cluster on edge cloudlet (Munich)' + technology 'Kubernetes' + + docService = component 'Documentation Service' { + description 'LoadBalancer service exposing docs on port 80' + technology 'K8s Service' + } + + docDeployment = component 'Documentation Deployment' { + description 'Pod running Hugo-generated static site' + technology 'K8s Deployment, Nginx' + } + } +} + +// === Relationships: Documentor Workflow === +documentor -> contentRepo.contentPages 'writes documentation' { + description 'Creates and updates Markdown content' +} + +documentor -> contentRepo.archModels 'creates architecture models' { + description 'Defines C4 models with LikeC4 DSL' +} + +documentor -> taskfile 'executes local tasks' { + description 'task serve, task build, task test' +} + +// === Relationships: Local Development === +taskfile -> devServer 'starts' { + description 'task serve' +} + +devServer -> hugoSite 'renders' { + description 'Live reload on content changes' +} + +hugoSite -> contentRepo 'reads content from' { + description 'Processes Markdown and templates' +} + +hugoSite -> likec4Integration 'integrates' { + description 'Embeds architecture diagrams' +} + +likec4Integration -> contentRepo.archModels 'visualizes' { + description 'Renders C4 models as interactive diagrams' +} + +// === Relationships: Testing === +taskfile -> githubActions.testBuild 'can run locally' { + description 'task test:build' +} + +taskfile -> githubActions.testMarkdown 'can run locally' { + description 'task test:markdown' +} + +taskfile -> githubActions.testHtml 'can run locally' { + description 'task test:html' +} + +taskfile -> githubActions.testLinks 'can run locally' { + description 'task test:links' +} + +// === Relationships: CI/CD === +contentRepo -> githubActions 'triggers on push/PR' { + description 'Webhook on main branch' +} + +githubActions.testBuild -> hugoSite 'builds' { + description 'hugo --gc --minify' +} + +githubActions.testMarkdown -> contentRepo.contentPages 'validates' { + description 'Lints Markdown files' +} + +githubActions.testHtml -> hugoSite 'validates output' { + description 'Checks generated HTML' +} + +githubActions.testLinks -> hugoSite 'checks links in' { + description 'Detects broken links' +} + +githubActions -> containerBuild 'triggers on success' { + description 'Builds Docker image with Hugo output' +} + +containerBuild -> hugoSite 'packages' { + description 'public/ directory served by Nginx' +} + +// === Relationships: Deployment === +containerBuild -> deploymentEnv.edgeConnect 'pushes image to' { + description 'Tagged container image' +} + +deploymentEnv.edgeConnect -> deploymentEnv.k8sCluster 'deploys to' { + description 'Via edgeconnectdeployment.yaml' +} + +deploymentEnv.k8sCluster.docDeployment -> deploymentEnv.k8sCluster.docService 'exposed by' { + description 'Port 80' +} + +documentor -> deploymentEnv.k8sCluster.docService 'views published docs' { + description 'HTTPS access to live documentation' +} + +} + +// === Views === + +views { + + view overview of docPlatform { + title 'Documentation Platform Overview' + description 'High-level overview of the Hugo-based documentation platform for documentors' + + include * + + style documentor { + color green + } + style docPlatform { + color blue + } + } + + view localDevelopment of docPlatform { + title 'Local Development Workflow' + description 'How a documentor works locally with the documentation' + + include documentor + include docPlatform + include docPlatform.contentRepo -> * + include docPlatform.hugoSite + include docPlatform.likec4Integration + include docPlatform.taskfile + include docPlatform.devServer + + style documentor { + color green + } + style docPlatform.taskfile { + color amber + } + style docPlatform.devServer { + color amber + } + } + + view cicdPipeline of cicdPipeline { + title 'CI/CD Pipeline' + description 'Automated testing and container build process' + + include cicdPipeline + include cicdPipeline.githubActions -> * + include cicdPipeline.containerBuild + include docPlatform.contentRepo + include docPlatform.hugoSite + + style cicdPipeline.githubActions { + color blue + } + style cicdPipeline.containerBuild { + color indigo + } + } + + view deploymentFlow { + title 'Deployment to Edge Environment' + description 'How the documentation is deployed to the edge infrastructure' + + include cicdPipeline.containerBuild + include deploymentEnv + include deploymentEnv.edgeConnect + include deploymentEnv.k8sCluster -> * + include documentor + + style deploymentEnv { + color muted + } + style deploymentEnv.k8sCluster { + color secondary + } + } + + view fullWorkflow { + title 'Complete Documentor Workflow' + description 'End-to-end view from content creation to published documentation' + + include documentor + include docPlatform.contentRepo + include docPlatform.taskfile + include cicdPipeline.githubActions + include cicdPipeline.containerBuild + include deploymentEnv.edgeConnect + include deploymentEnv.k8sCluster + + style documentor { + color green + } + style docPlatform.taskfile { + color amber + } + style cicdPipeline.githubActions { + color blue + } + style deploymentEnv.k8sCluster { + color secondary + } + } + + view testingCapabilities of cicdPipeline.githubActions { + title 'Testing Capabilities' + description 'All automated tests that ensure documentation quality' + + include * + include docPlatform.hugoSite + include docPlatform.contentRepo.contentPages + include docPlatform.taskfile + + style cicdPipeline.githubActions { + color blue + } + } + +} + diff --git a/resources/likec4/models/spec.c4 b/resources/edp-likec4/models/spec.c4 similarity index 73% rename from resources/likec4/models/spec.c4 rename to resources/edp-likec4/models/spec.c4 index c00ac40..c99a0ad 100644 --- a/resources/likec4/models/spec.c4 +++ b/resources/edp-likec4/models/spec.c4 @@ -5,6 +5,12 @@ specification { color green } } + element person { + style { + shape person + color green + } + } element component element container { style { @@ -22,6 +28,13 @@ specification { element step element system element workflow + element tool + element process + element repository { + style { + shape storage + } + } deploymentNode cloud deploymentNode environment diff --git a/resources/likec4/package-lock.json b/resources/edp-likec4/package-lock.json similarity index 100% rename from resources/likec4/package-lock.json rename to resources/edp-likec4/package-lock.json diff --git a/resources/likec4/package.json b/resources/edp-likec4/package.json similarity index 100% rename from resources/likec4/package.json rename to resources/edp-likec4/package.json diff --git a/resources/likec4/views/deployment/kind/kind.c4 b/resources/edp-likec4/views/deployment/kind/kind.c4 similarity index 100% rename from resources/likec4/views/deployment/kind/kind.c4 rename to resources/edp-likec4/views/deployment/kind/kind.c4 diff --git a/resources/likec4/views/deployment/otc/edp.c4 b/resources/edp-likec4/views/deployment/otc/edp.c4 similarity index 100% rename from resources/likec4/views/deployment/otc/edp.c4 rename to resources/edp-likec4/views/deployment/otc/edp.c4 diff --git a/resources/likec4/views/deployment/otc/forgejo-runner-connections.md b/resources/edp-likec4/views/deployment/otc/forgejo-runner-connections.md similarity index 100% rename from resources/likec4/views/deployment/otc/forgejo-runner-connections.md rename to resources/edp-likec4/views/deployment/otc/forgejo-runner-connections.md diff --git a/resources/likec4/views/deployment/otc/foundry-and-edp.c4 b/resources/edp-likec4/views/deployment/otc/foundry-and-edp.c4 similarity index 100% rename from resources/likec4/views/deployment/otc/foundry-and-edp.c4 rename to resources/edp-likec4/views/deployment/otc/foundry-and-edp.c4 diff --git a/resources/likec4/views/deployment/otc/foundry.c4 b/resources/edp-likec4/views/deployment/otc/foundry.c4 similarity index 100% rename from resources/likec4/views/deployment/otc/foundry.c4 rename to resources/edp-likec4/views/deployment/otc/foundry.c4 diff --git a/resources/likec4/views/deployment/otc/otc-faas.c4 b/resources/edp-likec4/views/deployment/otc/otc-faas.c4 similarity index 100% rename from resources/likec4/views/deployment/otc/otc-faas.c4 rename to resources/edp-likec4/views/deployment/otc/otc-faas.c4 diff --git a/resources/likec4/views/dynamic/cicd/gitops-inner-outer-loop.c4 b/resources/edp-likec4/views/dynamic/cicd/gitops-inner-outer-loop.c4 similarity index 100% rename from resources/likec4/views/dynamic/cicd/gitops-inner-outer-loop.c4 rename to resources/edp-likec4/views/dynamic/cicd/gitops-inner-outer-loop.c4 diff --git a/resources/likec4/views/edp/edfbuilder.c4 b/resources/edp-likec4/views/edp/edfbuilder.c4 similarity index 100% rename from resources/likec4/views/edp/edfbuilder.c4 rename to resources/edp-likec4/views/edp/edfbuilder.c4 diff --git a/resources/likec4/views/edp/edp-as-idp.c4 b/resources/edp-likec4/views/edp/edp-as-idp.c4 similarity index 100% rename from resources/likec4/views/edp/edp-as-idp.c4 rename to resources/edp-likec4/views/edp/edp-as-idp.c4 diff --git a/resources/likec4/views/edp/edp-as-orchestrator.c4 b/resources/edp-likec4/views/edp/edp-as-orchestrator.c4 similarity index 100% rename from resources/likec4/views/edp/edp-as-orchestrator.c4 rename to resources/edp-likec4/views/edp/edp-as-orchestrator.c4 diff --git a/resources/likec4/views/edp/edp.c4 b/resources/edp-likec4/views/edp/edp.c4 similarity index 100% rename from resources/likec4/views/edp/edp.c4 rename to resources/edp-likec4/views/edp/edp.c4 diff --git a/resources/likec4/views/high-level-concept/application-transition.c4 b/resources/edp-likec4/views/high-level-concept/application-transition.c4 similarity index 100% rename from resources/likec4/views/high-level-concept/application-transition.c4 rename to resources/edp-likec4/views/high-level-concept/application-transition.c4 diff --git a/resources/likec4/views/high-level-concept/platform-context/developer-landscape-with-foundry.c4 b/resources/edp-likec4/views/high-level-concept/platform-context/developer-landscape-with-foundry.c4 similarity index 100% rename from resources/likec4/views/high-level-concept/platform-context/developer-landscape-with-foundry.c4 rename to resources/edp-likec4/views/high-level-concept/platform-context/developer-landscape-with-foundry.c4 diff --git a/resources/likec4/views/high-level-concept/platform-context/developer-landscape.c4 b/resources/edp-likec4/views/high-level-concept/platform-context/developer-landscape.c4 similarity index 100% rename from resources/likec4/views/high-level-concept/platform-context/developer-landscape.c4 rename to resources/edp-likec4/views/high-level-concept/platform-context/developer-landscape.c4 diff --git a/static/TeleNeoOffice-Bold.a7bb592b.ttf b/static/TeleNeoOffice-Bold.a7bb592b.ttf new file mode 120000 index 0000000..2099746 --- /dev/null +++ b/static/TeleNeoOffice-Bold.a7bb592b.ttf @@ -0,0 +1 @@ +fonts/TeleNeoOffice-Bold.a7bb592b.ttf \ No newline at end of file diff --git a/static/TeleNeoOffice-ExtraBold.fbe9fe42.ttf b/static/TeleNeoOffice-ExtraBold.fbe9fe42.ttf new file mode 120000 index 0000000..95eb627 --- /dev/null +++ b/static/TeleNeoOffice-ExtraBold.fbe9fe42.ttf @@ -0,0 +1 @@ +fonts/TeleNeoOffice-ExtraBold.fbe9fe42.ttf \ No newline at end of file diff --git a/static/TeleNeoOffice-Medium.79fb426d.ttf b/static/TeleNeoOffice-Medium.79fb426d.ttf new file mode 120000 index 0000000..5531d58 --- /dev/null +++ b/static/TeleNeoOffice-Medium.79fb426d.ttf @@ -0,0 +1 @@ +fonts/TeleNeoOffice-Medium.79fb426d.ttf \ No newline at end of file diff --git a/static/TeleNeoOffice-Regular.b0a2cff1.ttf b/static/TeleNeoOffice-Regular.b0a2cff1.ttf new file mode 120000 index 0000000..dcd4564 --- /dev/null +++ b/static/TeleNeoOffice-Regular.b0a2cff1.ttf @@ -0,0 +1 @@ +fonts/TeleNeoOffice-Regular.b0a2cff1.ttf \ No newline at end of file diff --git a/static/TeleNeoOffice-Thin.53627df9.ttf b/static/TeleNeoOffice-Thin.53627df9.ttf new file mode 120000 index 0000000..717239f --- /dev/null +++ b/static/TeleNeoOffice-Thin.53627df9.ttf @@ -0,0 +1 @@ +fonts/TeleNeoOffice-Thin.53627df9.ttf \ No newline at end of file diff --git a/static/fonts/TeleNeoOffice-Bold.a7bb592b.ttf b/static/fonts/TeleNeoOffice-Bold.a7bb592b.ttf new file mode 100644 index 0000000000000000000000000000000000000000..88d13e1a0bba460d3c93d17e5501b2be4e3775f9 GIT binary patch literal 224276 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