archsight 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Dockerfile +5 -4
- data/README.md +44 -59
- data/chart/archsight/Chart.yaml +6 -0
- data/chart/archsight/README.md +3 -0
- data/chart/archsight/templates/NOTES.txt +22 -0
- data/chart/archsight/templates/_helpers.tpl +62 -0
- data/chart/archsight/templates/deployment.yaml +114 -0
- data/chart/archsight/templates/ingress.yaml +56 -0
- data/chart/archsight/templates/resources-configmap.yaml +10 -0
- data/chart/archsight/templates/resources-pvc.yaml +23 -0
- data/chart/archsight/templates/service.yaml +15 -0
- data/chart/archsight/templates/serviceaccount.yaml +12 -0
- data/chart/archsight/values.yaml +162 -0
- data/docs/architecture.md +39 -0
- data/docs/docker.md +49 -0
- data/{lib/archsight/web/doc → docs}/import.md +10 -2
- data/{lib/archsight/web/doc → docs}/index.md.erb +3 -1
- data/docs/kubernetes.md +149 -0
- data/docs/licenses.md +307 -0
- data/lib/archsight/analysis/executor.rb +0 -10
- data/lib/archsight/annotations/annotation.rb +85 -36
- data/lib/archsight/annotations/architecture_annotations.rb +1 -34
- data/lib/archsight/annotations/computed.rb +1 -1
- data/lib/archsight/annotations/generated_annotations.rb +6 -3
- data/lib/archsight/annotations/git_annotations.rb +8 -4
- data/lib/archsight/annotations/interface_annotations.rb +35 -0
- data/lib/archsight/cli.rb +4 -2
- data/lib/archsight/editor/content_hasher.rb +37 -0
- data/lib/archsight/editor/file_writer.rb +79 -0
- data/lib/archsight/editor.rb +237 -0
- data/lib/archsight/graph.rb +1 -51
- data/lib/archsight/helpers.rb +0 -20
- data/lib/archsight/import/handlers/github.rb +16 -6
- data/lib/archsight/import/handlers/gitlab.rb +28 -10
- data/lib/archsight/import/handlers/repository.rb +56 -6
- data/lib/archsight/import/handlers/rest_api.rb +13 -1
- data/lib/archsight/import/license_analyzer.rb +650 -0
- data/lib/archsight/import/team_matcher.rb +111 -61
- data/lib/archsight/linter.rb +1 -1
- data/lib/archsight/mcp/base.rb +11 -0
- data/lib/archsight/mcp/execute_analysis_tool.rb +100 -0
- data/lib/archsight/mcp.rb +1 -0
- data/lib/archsight/renderer.rb +4 -4
- data/lib/archsight/resources/analysis.rb +1 -17
- data/lib/archsight/resources/application_interface.rb +1 -5
- data/lib/archsight/resources/base.rb +14 -14
- data/lib/archsight/resources/business_actor.rb +18 -3
- data/lib/archsight/resources/technology_artifact.rb +48 -0
- data/lib/archsight/resources/technology_interface.rb +1 -1
- data/lib/archsight/resources/technology_service.rb +5 -0
- data/lib/archsight/version.rb +1 -1
- data/lib/archsight/web/api/docs.rb +37 -2
- data/lib/archsight/web/api/json_helpers.rb +79 -13
- data/lib/archsight/web/api/openapi/spec.yaml +699 -0
- data/lib/archsight/web/api/routes.rb +23 -0
- data/lib/archsight/web/application.rb +48 -128
- data/lib/archsight/web/editor/form_builder.rb +100 -0
- data/lib/archsight/web/editor/helpers.rb +150 -0
- data/lib/archsight/web/editor/routes.rb +166 -0
- data/lib/archsight/web/public/vue/ApiDocsPage-B1RqTNqh.js +1 -0
- data/lib/archsight/web/public/vue/ApiDocsPage-DhNTOH4o.css +1 -0
- data/lib/archsight/web/public/vue/DocPage-DzwBgBd4.js +1 -0
- data/lib/archsight/web/public/vue/EditorPage-D_miHSv4.js +34 -0
- data/lib/archsight/web/public/vue/EditorPage-Dq0MuTnp.css +1 -0
- data/lib/archsight/web/public/vue/ErrorPage-CQQtPey3.js +2 -0
- data/lib/archsight/web/public/vue/ErrorPage-CwPT3JUr.css +1 -0
- data/lib/archsight/web/public/vue/GraphView-DRcIqAiR.css +1 -0
- data/lib/archsight/web/public/vue/GraphView-T9jFH_qg.js +1 -0
- data/lib/archsight/web/public/vue/InstanceRouter-1Sm-CRhf.js +2 -0
- data/lib/archsight/web/public/vue/InstanceRouter-BJkDRXZY.css +1 -0
- data/lib/archsight/web/public/vue/KindList-JA_L_-Cz.js +1 -0
- data/lib/archsight/web/public/vue/ResourceList-8iqavWdg.js +1 -0
- data/lib/archsight/web/public/vue/ResourceList-DP-z-j71.css +1 -0
- data/lib/archsight/web/public/vue/SearchResults-BGHbg48-.css +1 -0
- data/lib/archsight/web/public/vue/SearchResults-BdgFeHcm.js +1 -0
- data/lib/archsight/web/public/vue/_basePickBy-CVgieyx-.js +1 -0
- data/lib/archsight/web/public/vue/_baseUniq-BNfrOSaP.js +1 -0
- data/lib/archsight/web/public/vue/architectureDiagram-VXUJARFQ-CJXNpTr5.js +36 -0
- data/lib/archsight/web/public/vue/blockDiagram-VD42YOAC-B5488Hes.js +122 -0
- data/lib/archsight/web/public/vue/c4Diagram-YG6GDRKO-eYY3hprM.js +10 -0
- data/lib/archsight/web/public/vue/chunk-4BX2VUAB-ZoXeL4D1.js +1 -0
- data/lib/archsight/web/public/vue/chunk-55IACEB6-rNtQYnu_.js +1 -0
- data/lib/archsight/web/public/vue/chunk-B4BG7PRW-DolAeVV9.js +165 -0
- data/lib/archsight/web/public/vue/chunk-DI55MBZ5-DnN0f_hj.js +220 -0
- data/lib/archsight/web/public/vue/chunk-FMBD7UC4-BQWOCMuR.js +15 -0
- data/lib/archsight/web/public/vue/chunk-QN33PNHL-DId301Kb.js +1 -0
- data/lib/archsight/web/public/vue/chunk-QZHKN3VN-xbY0NLgv.js +1 -0
- data/lib/archsight/web/public/vue/chunk-TZMSLE5B-CgF9_37b.js +1 -0
- data/lib/archsight/web/public/vue/classDiagram-2ON5EDUG-jGlvI-Za.js +1 -0
- data/lib/archsight/web/public/vue/classDiagram-v2-WZHVMYZB-jGlvI-Za.js +1 -0
- data/lib/archsight/web/public/vue/clone-6iRPe1-W.js +1 -0
- data/lib/archsight/web/public/vue/cose-bilkent-S5V4N54A-CB9Zfu50.js +1 -0
- data/lib/archsight/web/public/vue/cytoscape.esm-5J0xJHOV.js +321 -0
- data/lib/archsight/web/public/vue/dagre-6UL2VRFP-BqkmE-LI.js +4 -0
- data/lib/archsight/web/public/vue/diagram-PSM6KHXK-CKBfqtw3.js +24 -0
- data/lib/archsight/web/public/vue/diagram-QEK2KX5R-B78rOlvK.js +43 -0
- data/lib/archsight/web/public/vue/diagram-S2PKOQOG-BlXC6Cia.js +24 -0
- data/lib/archsight/web/public/vue/erDiagram-Q2GNP2WA-BnliyziJ.js +60 -0
- data/lib/archsight/web/public/vue/flowDiagram-NV44I4VS-wuqPowTd.js +162 -0
- data/lib/archsight/web/public/vue/ganttDiagram-JELNMOA3-GSffAIH3.js +267 -0
- data/lib/archsight/web/public/vue/gitGraphDiagram-V2S2FVAM-OA7VyugW.js +65 -0
- data/lib/archsight/web/public/vue/graph-BXHAtA0S.js +1 -0
- data/lib/archsight/web/public/vue/graphviz-CJms5bxZ.js +13 -0
- data/lib/archsight/web/public/vue/index-DsEsN0_K.js +2 -0
- data/lib/archsight/web/public/vue/index-Tiu4C-Sb.css +1 -0
- data/lib/archsight/web/public/vue/infoDiagram-HS3SLOUP-nlVe2qgv.js +2 -0
- data/lib/archsight/web/public/vue/journeyDiagram-XKPGCS4Q-CtTIcKwf.js +139 -0
- data/lib/archsight/web/public/vue/kanban-definition-3W4ZIXB7-837KX0sW.js +89 -0
- data/lib/archsight/web/public/vue/katex-C-M49wc6.js +261 -0
- data/lib/archsight/web/public/vue/layout-DtE0QdL6.js +1 -0
- data/lib/archsight/web/public/vue/mermaid-DpPHPFQh.js +250 -0
- data/lib/archsight/web/public/vue/mindmap-definition-VGOIOE7T-9gLF2AoY.js +68 -0
- data/lib/archsight/web/public/vue/pieDiagram-ADFJNKIX-CyCNgw3u.js +30 -0
- data/lib/archsight/web/public/vue/quadrantDiagram-AYHSOK5B-CkPh8g02.js +7 -0
- data/lib/archsight/web/public/vue/requirementDiagram-UZGBJVZJ-Dkt6OSlY.js +64 -0
- data/lib/archsight/web/public/vue/sankeyDiagram-TZEHDZUN-BqprTk8x.js +10 -0
- data/lib/archsight/web/public/vue/sequenceDiagram-WL72ISMW-CTmTe1FQ.js +145 -0
- data/lib/archsight/web/public/vue/stateDiagram-FKZM4ZOC-CphqmkEU.js +1 -0
- data/lib/archsight/web/public/vue/stateDiagram-v2-4FDKWEC3-CxaDW5sW.js +1 -0
- data/lib/archsight/web/public/vue/timeline-definition-IT6M3QCI-CSQUZkyE.js +61 -0
- data/lib/archsight/web/public/vue/treemap-GDKQZRPO-DTojm7Yr.js +162 -0
- data/lib/archsight/web/public/{css/graph.css → vue/useGraphviz-A5s4h76R.js} +2 -1
- data/lib/archsight/web/public/vue/useHighlight-C6Kb5G3l.js +10 -0
- data/lib/archsight/web/public/vue/useMermaid-DqxTrLRB.js +1 -0
- data/lib/archsight/web/public/vue/usePanZoom-BybZ_rfh.js +11 -0
- data/lib/archsight/web/public/vue/xychartDiagram-PRI3JC2R-B1ZJZtDC.js +7 -0
- data/lib/archsight/web/public/vue.html +15 -0
- data/media/artifact.jpg +0 -0
- data/media/service.jpg +0 -0
- metadata +104 -77
- data/lib/archsight/web/public/css/artifact.css +0 -995
- data/lib/archsight/web/public/css/base.css +0 -201
- data/lib/archsight/web/public/css/highlight.min.css +0 -10
- data/lib/archsight/web/public/css/iconoir.css +0 -22
- data/lib/archsight/web/public/css/instance.css +0 -818
- data/lib/archsight/web/public/css/layout.css +0 -421
- data/lib/archsight/web/public/css/mermaid-layers.css +0 -188
- data/lib/archsight/web/public/css/pico.min.css +0 -4
- data/lib/archsight/web/public/img/archimate.png +0 -0
- data/lib/archsight/web/public/img/togaf-high-level.png +0 -0
- data/lib/archsight/web/public/js/graph-zoom.js +0 -18
- data/lib/archsight/web/public/js/highlight.min.js +0 -3899
- data/lib/archsight/web/public/js/htmx.min.js +0 -1
- data/lib/archsight/web/public/js/mermaid-init.js +0 -88
- data/lib/archsight/web/public/js/mermaid.min.js +0 -2811
- data/lib/archsight/web/public/js/sparkline.js +0 -42
- data/lib/archsight/web/public/js/svg-pan-zoom.min.js +0 -3
- data/lib/archsight/web/public/js/svg-zoom-controls.js +0 -93
- data/lib/archsight/web/views/api_docs.erb +0 -19
- data/lib/archsight/web/views/index.haml +0 -12
- data/lib/archsight/web/views/partials/artifact/_activity.haml +0 -55
- data/lib/archsight/web/views/partials/artifact/_agentic.haml +0 -25
- data/lib/archsight/web/views/partials/artifact/_deployment.haml +0 -29
- data/lib/archsight/web/views/partials/artifact/_git_info.haml +0 -16
- data/lib/archsight/web/views/partials/artifact/_language_stats.haml +0 -53
- data/lib/archsight/web/views/partials/artifact/_links.haml +0 -24
- data/lib/archsight/web/views/partials/artifact/_project_estimate.haml +0 -32
- data/lib/archsight/web/views/partials/artifact/_repositories.haml +0 -55
- data/lib/archsight/web/views/partials/artifact/_team.haml +0 -83
- data/lib/archsight/web/views/partials/artifact/_workflow.haml +0 -69
- data/lib/archsight/web/views/partials/components/_activity.haml +0 -37
- data/lib/archsight/web/views/partials/components/_git.haml +0 -17
- data/lib/archsight/web/views/partials/components/_jira.haml +0 -18
- data/lib/archsight/web/views/partials/components/_languages.haml +0 -29
- data/lib/archsight/web/views/partials/components/_owner.haml +0 -15
- data/lib/archsight/web/views/partials/components/_repositories.haml +0 -37
- data/lib/archsight/web/views/partials/components/_status.haml +0 -23
- data/lib/archsight/web/views/partials/instance/_analysis_detail.haml +0 -74
- data/lib/archsight/web/views/partials/instance/_analysis_result.haml +0 -64
- data/lib/archsight/web/views/partials/instance/_detail.haml +0 -103
- data/lib/archsight/web/views/partials/instance/_graph.haml +0 -6
- data/lib/archsight/web/views/partials/instance/_import_detail.haml +0 -87
- data/lib/archsight/web/views/partials/instance/_list.haml +0 -84
- data/lib/archsight/web/views/partials/instance/_relations.haml +0 -43
- data/lib/archsight/web/views/partials/instance/_requirements.haml +0 -41
- data/lib/archsight/web/views/partials/instance/_view_detail.haml +0 -57
- data/lib/archsight/web/views/partials/layout/_content.haml +0 -44
- data/lib/archsight/web/views/partials/layout/_error.haml +0 -22
- data/lib/archsight/web/views/partials/layout/_head.haml +0 -24
- data/lib/archsight/web/views/partials/layout/_navigation.haml +0 -21
- data/lib/archsight/web/views/partials/layout/_sidebar.haml +0 -27
- data/lib/archsight/web/views/search.haml +0 -53
- /data/{lib/archsight/web/doc → docs}/archimate.md +0 -0
- /data/{lib/archsight/web/doc → docs}/computed_annotations.md +0 -0
- /data/{lib/archsight/web/doc → docs}/icons.md +0 -0
- /data/{lib/archsight/web/doc → docs}/modeling.md +0 -0
- /data/{lib/archsight/web/doc → docs}/search.md +0 -0
- /data/{lib/archsight/web/doc → docs}/togaf.md +0 -0
- /data/{lib/archsight/web/doc → docs}/tool.md +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 750620aa30b68f0a3cfa0f53be2d717ae0496b829e5ecc588a904b3bf39dbd10
|
|
4
|
+
data.tar.gz: 8ddf46b557c7830212d0e699149ce2b53b9476c7748fc90c82480f22be226047
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 39b0cc9b3b321c1e2627197a8f2edb13bdb8fe78273e315b70c886d05d64da534769850f5991e70d6c38d549f7229988d3d2e03bbd075f01e9aad0b4b4aad802
|
|
7
|
+
data.tar.gz: 69c4784e97d7c2aa01bf1030109a621f1eacdf4d7fe131d2e7c56eb29b42524ed3a68c69f97003ef804a7e38cedf118dc186157a948e5c81479191927955fa94
|
data/Dockerfile
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
# Build stage
|
|
2
2
|
FROM ruby:4.0-alpine3.23 AS builder
|
|
3
3
|
|
|
4
|
-
RUN apk add --no-cache build-base git libffi-dev yaml-dev
|
|
4
|
+
RUN apk add --no-cache build-base git libffi-dev yaml-dev nodejs npm
|
|
5
5
|
|
|
6
6
|
WORKDIR /app
|
|
7
7
|
COPY . .
|
|
8
8
|
|
|
9
|
+
# Build frontend assets
|
|
10
|
+
RUN cd frontend && npm ci && npm run build
|
|
11
|
+
|
|
9
12
|
# Build and install the gem
|
|
10
13
|
RUN gem build archsight.gemspec && \
|
|
11
14
|
gem install --no-document archsight-*.gem
|
|
@@ -13,8 +16,6 @@ RUN gem build archsight.gemspec && \
|
|
|
13
16
|
# Runtime stage
|
|
14
17
|
FROM ruby:4.0-alpine3.23
|
|
15
18
|
|
|
16
|
-
RUN apk add --no-cache graphviz
|
|
17
|
-
|
|
18
19
|
# Copy installed gems from builder (including default gems that were updated)
|
|
19
20
|
COPY --from=builder /usr/local/bundle /usr/local/bundle
|
|
20
21
|
COPY --from=builder /usr/local/lib/ruby/gems /usr/local/lib/ruby/gems
|
|
@@ -35,4 +36,4 @@ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
|
35
36
|
CMD wget --no-verbose --tries=1 --spider http://localhost:4567/ || exit 1
|
|
36
37
|
|
|
37
38
|
ENTRYPOINT ["archsight"]
|
|
38
|
-
CMD ["web", "--port", "4567"]
|
|
39
|
+
CMD ["web", "--port", "4567", "--host", "0.0.0.0"]
|
data/README.md
CHANGED
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
|
|
8
8
|
Ruby gem for visualizing and managing enterprise architecture documentation using YAML resources with GraphViz visualization. Inspired by ArchiMate 3.2.
|
|
9
9
|
|
|
10
|
+
| Service view | Artifact view |
|
|
11
|
+
|:---:|:---:|
|
|
12
|
+
|  |  |
|
|
13
|
+
|
|
10
14
|
## Installation
|
|
11
15
|
|
|
12
16
|
Add to your Gemfile:
|
|
@@ -23,8 +27,6 @@ gem install archsight
|
|
|
23
27
|
|
|
24
28
|
## Quick Start
|
|
25
29
|
|
|
26
|
-
### Option 1: CLI
|
|
27
|
-
|
|
28
30
|
```bash
|
|
29
31
|
# Start web server (looks for resources in current directory)
|
|
30
32
|
archsight web
|
|
@@ -38,29 +40,7 @@ ARCHSIGHT_RESOURCES_DIR=/path/to/resources archsight web
|
|
|
38
40
|
|
|
39
41
|
Access at: <http://localhost:4567>
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
# Run web server (default)
|
|
45
|
-
docker run -p 4567:4567 -v "/path/to/resources:/resources" ghcr.io/ionos-cloud/archsight
|
|
46
|
-
|
|
47
|
-
# Run in production mode with logging
|
|
48
|
-
docker run -p 4567:4567 -v "/path/to/resources:/resources" ghcr.io/ionos-cloud/archsight web --production
|
|
49
|
-
|
|
50
|
-
# Run lint
|
|
51
|
-
docker run -v "/path/to/resources:/resources" ghcr.io/ionos-cloud/archsight lint -r /resources
|
|
52
|
-
|
|
53
|
-
# Run any command
|
|
54
|
-
docker run ghcr.io/ionos-cloud/archsight version
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Access web interface at: <http://localhost:4567>
|
|
58
|
-
|
|
59
|
-
**Notes:**
|
|
60
|
-
|
|
61
|
-
- Volume mount `-v "/path/to/resources:/resources"` mounts your resources directory
|
|
62
|
-
- Default command starts the web server on port 4567
|
|
63
|
-
- Pass subcommands directly (lint, version, console, template)
|
|
43
|
+
Also available as [Docker](docs/docker.md) image and [Helm chart](docs/kubernetes.md).
|
|
64
44
|
|
|
65
45
|
## CLI Commands
|
|
66
46
|
|
|
@@ -79,6 +59,7 @@ archsight version # Show version
|
|
|
79
59
|
```bash
|
|
80
60
|
archsight web [--resources PATH] [--port PORT] [--host HOST]
|
|
81
61
|
[--production] [--disable-reload] [--enable-logging]
|
|
62
|
+
[--inline-edit]
|
|
82
63
|
```
|
|
83
64
|
|
|
84
65
|
| Option | Description |
|
|
@@ -89,6 +70,7 @@ archsight web [--resources PATH] [--port PORT] [--host HOST]
|
|
|
89
70
|
| `--production` | Run in production mode (quiet startup) |
|
|
90
71
|
| `--disable-reload` | Disable the reload button in the UI |
|
|
91
72
|
| `--enable-logging` | Enable request logging (default: false in dev, true in prod) |
|
|
73
|
+
| `--inline-edit` | Enable inline editing to save directly to source files |
|
|
92
74
|
|
|
93
75
|
## Features
|
|
94
76
|
|
|
@@ -119,7 +101,7 @@ claude mcp add --transport sse ionos-architecture http://localhost:4567/mcp/sse
|
|
|
119
101
|
**Browse & Search:**
|
|
120
102
|
|
|
121
103
|
- Browse resources by type (Products, Services, Components, Requirements, etc.)
|
|
122
|
-
- Search by name or tag using the [query language](
|
|
104
|
+
- Search by name or tag using the [query language](docs/search.md)
|
|
123
105
|
- Filter by annotations (quality attributes, status, frameworks)
|
|
124
106
|
|
|
125
107
|
**Visualization:**
|
|
@@ -129,6 +111,33 @@ claude mcp add --transport sse ionos-architecture http://localhost:4567/mcp/sse
|
|
|
129
111
|
- Dark mode support
|
|
130
112
|
- Layer-based color scheme (Business, Application, Technology, Data)
|
|
131
113
|
|
|
114
|
+
### Resource Editor
|
|
115
|
+
|
|
116
|
+
Create and edit resources through the web interface:
|
|
117
|
+
|
|
118
|
+
**Edit existing resource:**
|
|
119
|
+
|
|
120
|
+
- Navigate to any resource detail page
|
|
121
|
+
- Click the "Edit" button (only available for non-generated resources)
|
|
122
|
+
- Modify annotations and relations
|
|
123
|
+
- Generate YAML and copy to clipboard
|
|
124
|
+
|
|
125
|
+
**Create new resource:**
|
|
126
|
+
|
|
127
|
+
- Go to any kind listing (e.g., /kinds/ApplicationComponent)
|
|
128
|
+
- Click "New" button
|
|
129
|
+
- Fill in required fields
|
|
130
|
+
- Add relations using cascading dropdowns
|
|
131
|
+
- Generate YAML and copy to clipboard
|
|
132
|
+
|
|
133
|
+
The editor supports:
|
|
134
|
+
|
|
135
|
+
- Type-aware form fields (dropdowns for enums, number inputs, URL validation)
|
|
136
|
+
- Markdown textarea for descriptions
|
|
137
|
+
- Relation management with cascading dropdowns
|
|
138
|
+
- Validation before YAML generation
|
|
139
|
+
- One-click copy to clipboard
|
|
140
|
+
|
|
132
141
|
### Validation
|
|
133
142
|
|
|
134
143
|
Validate YAML syntax and verify all relationship references:
|
|
@@ -150,42 +159,18 @@ Detailed documentation is available in the web interface under the Help menu:
|
|
|
150
159
|
|
|
151
160
|
| Guide | Description |
|
|
152
161
|
|-------|-------------|
|
|
153
|
-
| [Modeling Guide](
|
|
154
|
-
| [Query Language](
|
|
155
|
-
| [Computed Annotations](
|
|
156
|
-
| [ArchiMate Reference](
|
|
157
|
-
| [TOGAF Reference](
|
|
162
|
+
| [Modeling Guide](docs/modeling.md) | How to model architecture using resource types and relations |
|
|
163
|
+
| [Query Language](docs/search.md) | Full query syntax reference for searching resources |
|
|
164
|
+
| [Computed Annotations](docs/computed_annotations.md) | Aggregating values across relations |
|
|
165
|
+
| [ArchiMate Reference](docs/archimate.md) | ArchiMate concepts and mapping |
|
|
166
|
+
| [TOGAF Reference](docs/togaf.md) | TOGAF alignment and concepts |
|
|
167
|
+
| [Architecture](docs/architecture.md) | Technology stack and directory structure |
|
|
168
|
+
| [Docker](docs/docker.md) | Running Archsight in Docker |
|
|
169
|
+
| [Kubernetes](docs/kubernetes.md) | Helm chart deployment guide |
|
|
158
170
|
|
|
159
171
|
## Architecture
|
|
160
172
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
- **Web Framework**: Sinatra
|
|
164
|
-
- **Templating**: Haml
|
|
165
|
-
- **Styling**: Pico CSS v2.x
|
|
166
|
-
- **Interactivity**: HTMX
|
|
167
|
-
- **Icons**: Iconoir (1,671+ icons)
|
|
168
|
-
- **Visualization**: GraphViz (@hpcc-js/wasm for client-side SVG)
|
|
169
|
-
|
|
170
|
-
### Directory Structure
|
|
171
|
-
|
|
172
|
-
```text
|
|
173
|
-
archsight/
|
|
174
|
-
├── exe/archsight # CLI executable
|
|
175
|
-
├── lib/
|
|
176
|
-
│ ├── archsight.rb # Entry point
|
|
177
|
-
│ └── archsight/
|
|
178
|
-
│ ├── cli.rb # Thor CLI
|
|
179
|
-
│ ├── configuration.rb # Resources path config
|
|
180
|
-
│ ├── database.rb # YAML loader and validator
|
|
181
|
-
│ ├── query/ # Query language (lexer, parser, evaluator)
|
|
182
|
-
│ ├── resources/ # Resource types (20+)
|
|
183
|
-
│ ├── annotations/ # Annotation modules
|
|
184
|
-
│ ├── mcp/ # MCP server tools
|
|
185
|
-
│ └── web/ # Sinatra app, views, assets
|
|
186
|
-
│ └── doc/ # Documentation (markdown)
|
|
187
|
-
└── test/ # Test suite
|
|
188
|
-
```
|
|
173
|
+
See [Architecture](docs/architecture.md) for the technology stack and directory structure.
|
|
189
174
|
|
|
190
175
|
## Contributing
|
|
191
176
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
1. Get the application URL by running these commands:
|
|
2
|
+
{{- if .Values.ingress.enabled }}
|
|
3
|
+
{{- range $host := .Values.ingress.hosts }}
|
|
4
|
+
{{- range .paths }}
|
|
5
|
+
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
|
6
|
+
{{- end }}
|
|
7
|
+
{{- end }}
|
|
8
|
+
{{- else if contains "NodePort" .Values.service.type }}
|
|
9
|
+
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "archsight.fullname" . }})
|
|
10
|
+
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
|
11
|
+
echo http://$NODE_IP:$NODE_PORT
|
|
12
|
+
{{- else if contains "LoadBalancer" .Values.service.type }}
|
|
13
|
+
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
|
14
|
+
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "archsight.fullname" . }}'
|
|
15
|
+
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "archsight.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
|
16
|
+
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
|
17
|
+
{{- else if contains "ClusterIP" .Values.service.type }}
|
|
18
|
+
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "archsight.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
|
19
|
+
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
|
20
|
+
echo "Visit http://127.0.0.1:8080 to use your application"
|
|
21
|
+
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
|
22
|
+
{{- end }}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{{/*
|
|
2
|
+
Expand the name of the chart.
|
|
3
|
+
*/}}
|
|
4
|
+
{{- define "archsight.name" -}}
|
|
5
|
+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
|
6
|
+
{{- end }}
|
|
7
|
+
|
|
8
|
+
{{/*
|
|
9
|
+
Create a default fully qualified app name.
|
|
10
|
+
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
|
11
|
+
If release name contains chart name it will be used as a full name.
|
|
12
|
+
*/}}
|
|
13
|
+
{{- define "archsight.fullname" -}}
|
|
14
|
+
{{- if .Values.fullnameOverride }}
|
|
15
|
+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
|
16
|
+
{{- else }}
|
|
17
|
+
{{- $name := default .Chart.Name .Values.nameOverride }}
|
|
18
|
+
{{- if contains $name .Release.Name }}
|
|
19
|
+
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
|
20
|
+
{{- else }}
|
|
21
|
+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
|
22
|
+
{{- end }}
|
|
23
|
+
{{- end }}
|
|
24
|
+
{{- end }}
|
|
25
|
+
|
|
26
|
+
{{/*
|
|
27
|
+
Create chart name and version as used by the chart label.
|
|
28
|
+
*/}}
|
|
29
|
+
{{- define "archsight.chart" -}}
|
|
30
|
+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
|
31
|
+
{{- end }}
|
|
32
|
+
|
|
33
|
+
{{/*
|
|
34
|
+
Common labels
|
|
35
|
+
*/}}
|
|
36
|
+
{{- define "archsight.labels" -}}
|
|
37
|
+
helm.sh/chart: {{ include "archsight.chart" . }}
|
|
38
|
+
{{ include "archsight.selectorLabels" . }}
|
|
39
|
+
{{- if .Chart.AppVersion }}
|
|
40
|
+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
|
41
|
+
{{- end }}
|
|
42
|
+
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
|
43
|
+
{{- end }}
|
|
44
|
+
|
|
45
|
+
{{/*
|
|
46
|
+
Selector labels
|
|
47
|
+
*/}}
|
|
48
|
+
{{- define "archsight.selectorLabels" -}}
|
|
49
|
+
app.kubernetes.io/name: {{ include "archsight.name" . }}
|
|
50
|
+
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
51
|
+
{{- end }}
|
|
52
|
+
|
|
53
|
+
{{/*
|
|
54
|
+
Create the name of the service account to use
|
|
55
|
+
*/}}
|
|
56
|
+
{{- define "archsight.serviceAccountName" -}}
|
|
57
|
+
{{- if .Values.serviceAccount.create }}
|
|
58
|
+
{{- default (include "archsight.fullname" .) .Values.serviceAccount.name }}
|
|
59
|
+
{{- else }}
|
|
60
|
+
{{- default "default" .Values.serviceAccount.name }}
|
|
61
|
+
{{- end }}
|
|
62
|
+
{{- end }}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
apiVersion: apps/v1
|
|
2
|
+
kind: Deployment
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ include "archsight.fullname" . }}
|
|
5
|
+
labels:
|
|
6
|
+
{{- include "archsight.labels" . | nindent 4 }}
|
|
7
|
+
spec:
|
|
8
|
+
{{- if not .Values.autoscaling.enabled }}
|
|
9
|
+
replicas: {{ .Values.replicaCount }}
|
|
10
|
+
{{- end }}
|
|
11
|
+
selector:
|
|
12
|
+
matchLabels:
|
|
13
|
+
{{- include "archsight.selectorLabels" . | nindent 6 }}
|
|
14
|
+
template:
|
|
15
|
+
metadata:
|
|
16
|
+
{{- with .Values.podAnnotations }}
|
|
17
|
+
annotations:
|
|
18
|
+
{{- toYaml . | nindent 8 }}
|
|
19
|
+
{{- end }}
|
|
20
|
+
labels:
|
|
21
|
+
{{- include "archsight.selectorLabels" . | nindent 8 }}
|
|
22
|
+
spec:
|
|
23
|
+
{{- with .Values.imagePullSecrets }}
|
|
24
|
+
imagePullSecrets:
|
|
25
|
+
{{- toYaml . | nindent 8 }}
|
|
26
|
+
{{- end }}
|
|
27
|
+
serviceAccountName: {{ include "archsight.serviceAccountName" . }}
|
|
28
|
+
securityContext:
|
|
29
|
+
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
|
30
|
+
|
|
31
|
+
{{- with .Values.initContainers }}
|
|
32
|
+
initContainers:
|
|
33
|
+
{{- toYaml . | nindent 8 }}
|
|
34
|
+
{{- end }}
|
|
35
|
+
|
|
36
|
+
containers:
|
|
37
|
+
- name: {{ .Chart.Name }}
|
|
38
|
+
securityContext:
|
|
39
|
+
{{- toYaml .Values.securityContext | nindent 12 }}
|
|
40
|
+
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
|
41
|
+
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
|
42
|
+
env:
|
|
43
|
+
- name: ARCHSIGHT_RESOURCES_DIR
|
|
44
|
+
value: {{ .Values.app.resourcesDir | quote }}
|
|
45
|
+
- name: APP_ENV
|
|
46
|
+
value: {{ .Values.app.env | quote }}
|
|
47
|
+
{{- if .Values.args }}
|
|
48
|
+
args:
|
|
49
|
+
{{- toYaml .Values.args | nindent 12 }}
|
|
50
|
+
{{- end }}
|
|
51
|
+
ports:
|
|
52
|
+
- name: http
|
|
53
|
+
containerPort: 4567
|
|
54
|
+
protocol: TCP
|
|
55
|
+
livenessProbe:
|
|
56
|
+
httpGet:
|
|
57
|
+
path: /
|
|
58
|
+
port: http
|
|
59
|
+
initialDelaySeconds: 5
|
|
60
|
+
periodSeconds: 30
|
|
61
|
+
timeoutSeconds: 3
|
|
62
|
+
failureThreshold: 3
|
|
63
|
+
readinessProbe:
|
|
64
|
+
httpGet:
|
|
65
|
+
path: /
|
|
66
|
+
port: http
|
|
67
|
+
initialDelaySeconds: 5
|
|
68
|
+
periodSeconds: 30
|
|
69
|
+
timeoutSeconds: 3
|
|
70
|
+
failureThreshold: 3
|
|
71
|
+
resources:
|
|
72
|
+
{{- toYaml .Values.resources | nindent 12 }}
|
|
73
|
+
volumeMounts:
|
|
74
|
+
{{- if ne .Values.content.type "custom" }}
|
|
75
|
+
- name: resources
|
|
76
|
+
mountPath: {{ .Values.app.resourcesDir }}
|
|
77
|
+
{{- end }}
|
|
78
|
+
{{- with .Values.extraVolumeMounts }}
|
|
79
|
+
{{- toYaml . | nindent 12 }}
|
|
80
|
+
{{- end }}
|
|
81
|
+
|
|
82
|
+
{{- with .Values.sidecars }}
|
|
83
|
+
{{- toYaml . | nindent 8 }}
|
|
84
|
+
{{- end }}
|
|
85
|
+
|
|
86
|
+
volumes:
|
|
87
|
+
{{- if eq .Values.content.type "emptyDir" }}
|
|
88
|
+
- name: resources
|
|
89
|
+
emptyDir: {}
|
|
90
|
+
{{- else if eq .Values.content.type "configMap" }}
|
|
91
|
+
- name: resources
|
|
92
|
+
configMap:
|
|
93
|
+
name: {{ default (printf "%s-resources" (include "archsight.fullname" .)) .Values.content.configMap.name }}
|
|
94
|
+
{{- else if eq .Values.content.type "persistence" }}
|
|
95
|
+
- name: resources
|
|
96
|
+
persistentVolumeClaim:
|
|
97
|
+
claimName: {{ default (printf "%s-resources" (include "archsight.fullname" .)) .Values.content.persistence.existingClaim }}
|
|
98
|
+
{{- end }}
|
|
99
|
+
{{- with .Values.extraVolumes }}
|
|
100
|
+
{{- toYaml . | nindent 8 }}
|
|
101
|
+
{{- end }}
|
|
102
|
+
|
|
103
|
+
{{- with .Values.nodeSelector }}
|
|
104
|
+
nodeSelector:
|
|
105
|
+
{{- toYaml . | nindent 8 }}
|
|
106
|
+
{{- end }}
|
|
107
|
+
{{- with .Values.affinity }}
|
|
108
|
+
affinity:
|
|
109
|
+
{{- toYaml . | nindent 8 }}
|
|
110
|
+
{{- end }}
|
|
111
|
+
{{- with .Values.tolerations }}
|
|
112
|
+
tolerations:
|
|
113
|
+
{{- toYaml . | nindent 8 }}
|
|
114
|
+
{{- end }}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{{- if .Values.ingress.enabled -}}
|
|
2
|
+
{{- $fullName := include "archsight.fullname" . -}}
|
|
3
|
+
{{- $svcPort := .Values.service.port -}}
|
|
4
|
+
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
|
|
5
|
+
apiVersion: networking.k8s.io/v1
|
|
6
|
+
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
|
7
|
+
apiVersion: networking.k8s.io/v1beta1
|
|
8
|
+
{{- else -}}
|
|
9
|
+
apiVersion: extensions/v1beta1
|
|
10
|
+
{{- end }}
|
|
11
|
+
kind: Ingress
|
|
12
|
+
metadata:
|
|
13
|
+
name: {{ $fullName }}
|
|
14
|
+
labels:
|
|
15
|
+
{{- include "archsight.labels" . | nindent 4 }}
|
|
16
|
+
{{- with .Values.ingress.annotations }}
|
|
17
|
+
annotations:
|
|
18
|
+
{{- toYaml . | nindent 4 }}
|
|
19
|
+
{{- end }}
|
|
20
|
+
spec:
|
|
21
|
+
{{- if .Values.ingress.className }}
|
|
22
|
+
ingressClassName: {{ .Values.ingress.className }}
|
|
23
|
+
{{- end }}
|
|
24
|
+
{{- if .Values.ingress.tls }}
|
|
25
|
+
tls:
|
|
26
|
+
{{- range .Values.ingress.tls }}
|
|
27
|
+
- hosts:
|
|
28
|
+
{{- range .hosts }}
|
|
29
|
+
- {{ . | quote }}
|
|
30
|
+
{{- end }}
|
|
31
|
+
secretName: {{ .secretName }}
|
|
32
|
+
{{- end }}
|
|
33
|
+
{{- end }}
|
|
34
|
+
rules:
|
|
35
|
+
{{- range .Values.ingress.hosts }}
|
|
36
|
+
- host: {{ .host | quote }}
|
|
37
|
+
http:
|
|
38
|
+
paths:
|
|
39
|
+
{{- range .paths }}
|
|
40
|
+
- path: {{ .path }}
|
|
41
|
+
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
|
42
|
+
pathType: {{ .pathType }}
|
|
43
|
+
{{- end }}
|
|
44
|
+
backend:
|
|
45
|
+
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
|
46
|
+
service:
|
|
47
|
+
name: {{ $fullName }}
|
|
48
|
+
port:
|
|
49
|
+
number: {{ $svcPort }}
|
|
50
|
+
{{- else }}
|
|
51
|
+
serviceName: {{ $fullName }}
|
|
52
|
+
servicePort: {{ $svcPort }}
|
|
53
|
+
{{- end }}
|
|
54
|
+
{{- end }}
|
|
55
|
+
{{- end }}
|
|
56
|
+
{{- end }}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{{- if and (eq .Values.content.type "configMap") .Values.content.configMap.create }}
|
|
2
|
+
apiVersion: v1
|
|
3
|
+
kind: ConfigMap
|
|
4
|
+
metadata:
|
|
5
|
+
name: {{ default (printf "%s-resources" (include "archsight.fullname" .)) .Values.content.configMap.name }}
|
|
6
|
+
labels:
|
|
7
|
+
{{- include "archsight.labels" . | nindent 4 }}
|
|
8
|
+
data:
|
|
9
|
+
{{- toYaml .Values.content.configMap.data | nindent 2 }}
|
|
10
|
+
{{- end }}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{{- if and (eq .Values.content.type "persistence") .Values.content.persistence.enabled (not .Values.content.persistence.existingClaim) }}
|
|
2
|
+
apiVersion: v1
|
|
3
|
+
kind: PersistentVolumeClaim
|
|
4
|
+
metadata:
|
|
5
|
+
name: {{ printf "%s-resources" (include "archsight.fullname" .) }}
|
|
6
|
+
labels:
|
|
7
|
+
{{- include "archsight.labels" . | nindent 4 }}
|
|
8
|
+
{{- with .Values.content.persistence.annotations }}
|
|
9
|
+
annotations:
|
|
10
|
+
{{- toYaml . | nindent 4 }}
|
|
11
|
+
{{- end }}
|
|
12
|
+
spec:
|
|
13
|
+
accessModes:
|
|
14
|
+
{{- range .Values.content.persistence.accessModes }}
|
|
15
|
+
- {{ . | quote }}
|
|
16
|
+
{{- end }}
|
|
17
|
+
resources:
|
|
18
|
+
requests:
|
|
19
|
+
storage: {{ .Values.content.persistence.size | quote }}
|
|
20
|
+
{{- if .Values.content.persistence.storageClass }}
|
|
21
|
+
storageClassName: {{ .Values.content.persistence.storageClass | quote }}
|
|
22
|
+
{{- end }}
|
|
23
|
+
{{- end }}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
apiVersion: v1
|
|
2
|
+
kind: Service
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ include "archsight.fullname" . }}
|
|
5
|
+
labels:
|
|
6
|
+
{{- include "archsight.labels" . | nindent 4 }}
|
|
7
|
+
spec:
|
|
8
|
+
type: {{ .Values.service.type }}
|
|
9
|
+
ports:
|
|
10
|
+
- port: {{ .Values.service.port }}
|
|
11
|
+
targetPort: {{ .Values.service.targetPort }}
|
|
12
|
+
protocol: TCP
|
|
13
|
+
name: http
|
|
14
|
+
selector:
|
|
15
|
+
{{- include "archsight.selectorLabels" . | nindent 4 }}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{{- if .Values.serviceAccount.create -}}
|
|
2
|
+
apiVersion: v1
|
|
3
|
+
kind: ServiceAccount
|
|
4
|
+
metadata:
|
|
5
|
+
name: {{ include "archsight.serviceAccountName" . }}
|
|
6
|
+
labels:
|
|
7
|
+
{{- include "archsight.labels" . | nindent 4 }}
|
|
8
|
+
{{- with .Values.serviceAccount.annotations }}
|
|
9
|
+
annotations:
|
|
10
|
+
{{- toYaml . | nindent 4 }}
|
|
11
|
+
{{- end }}
|
|
12
|
+
{{- end }}
|