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.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +5 -4
  3. data/README.md +44 -59
  4. data/chart/archsight/Chart.yaml +6 -0
  5. data/chart/archsight/README.md +3 -0
  6. data/chart/archsight/templates/NOTES.txt +22 -0
  7. data/chart/archsight/templates/_helpers.tpl +62 -0
  8. data/chart/archsight/templates/deployment.yaml +114 -0
  9. data/chart/archsight/templates/ingress.yaml +56 -0
  10. data/chart/archsight/templates/resources-configmap.yaml +10 -0
  11. data/chart/archsight/templates/resources-pvc.yaml +23 -0
  12. data/chart/archsight/templates/service.yaml +15 -0
  13. data/chart/archsight/templates/serviceaccount.yaml +12 -0
  14. data/chart/archsight/values.yaml +162 -0
  15. data/docs/architecture.md +39 -0
  16. data/docs/docker.md +49 -0
  17. data/{lib/archsight/web/doc → docs}/import.md +10 -2
  18. data/{lib/archsight/web/doc → docs}/index.md.erb +3 -1
  19. data/docs/kubernetes.md +149 -0
  20. data/docs/licenses.md +307 -0
  21. data/lib/archsight/analysis/executor.rb +0 -10
  22. data/lib/archsight/annotations/annotation.rb +85 -36
  23. data/lib/archsight/annotations/architecture_annotations.rb +1 -34
  24. data/lib/archsight/annotations/computed.rb +1 -1
  25. data/lib/archsight/annotations/generated_annotations.rb +6 -3
  26. data/lib/archsight/annotations/git_annotations.rb +8 -4
  27. data/lib/archsight/annotations/interface_annotations.rb +35 -0
  28. data/lib/archsight/cli.rb +4 -2
  29. data/lib/archsight/editor/content_hasher.rb +37 -0
  30. data/lib/archsight/editor/file_writer.rb +79 -0
  31. data/lib/archsight/editor.rb +237 -0
  32. data/lib/archsight/graph.rb +1 -51
  33. data/lib/archsight/helpers.rb +0 -20
  34. data/lib/archsight/import/handlers/github.rb +16 -6
  35. data/lib/archsight/import/handlers/gitlab.rb +28 -10
  36. data/lib/archsight/import/handlers/repository.rb +56 -6
  37. data/lib/archsight/import/handlers/rest_api.rb +13 -1
  38. data/lib/archsight/import/license_analyzer.rb +650 -0
  39. data/lib/archsight/import/team_matcher.rb +111 -61
  40. data/lib/archsight/linter.rb +1 -1
  41. data/lib/archsight/mcp/base.rb +11 -0
  42. data/lib/archsight/mcp/execute_analysis_tool.rb +100 -0
  43. data/lib/archsight/mcp.rb +1 -0
  44. data/lib/archsight/renderer.rb +4 -4
  45. data/lib/archsight/resources/analysis.rb +1 -17
  46. data/lib/archsight/resources/application_interface.rb +1 -5
  47. data/lib/archsight/resources/base.rb +14 -14
  48. data/lib/archsight/resources/business_actor.rb +18 -3
  49. data/lib/archsight/resources/technology_artifact.rb +48 -0
  50. data/lib/archsight/resources/technology_interface.rb +1 -1
  51. data/lib/archsight/resources/technology_service.rb +5 -0
  52. data/lib/archsight/version.rb +1 -1
  53. data/lib/archsight/web/api/docs.rb +37 -2
  54. data/lib/archsight/web/api/json_helpers.rb +79 -13
  55. data/lib/archsight/web/api/openapi/spec.yaml +699 -0
  56. data/lib/archsight/web/api/routes.rb +23 -0
  57. data/lib/archsight/web/application.rb +48 -128
  58. data/lib/archsight/web/editor/form_builder.rb +100 -0
  59. data/lib/archsight/web/editor/helpers.rb +150 -0
  60. data/lib/archsight/web/editor/routes.rb +166 -0
  61. data/lib/archsight/web/public/vue/ApiDocsPage-B1RqTNqh.js +1 -0
  62. data/lib/archsight/web/public/vue/ApiDocsPage-DhNTOH4o.css +1 -0
  63. data/lib/archsight/web/public/vue/DocPage-DzwBgBd4.js +1 -0
  64. data/lib/archsight/web/public/vue/EditorPage-D_miHSv4.js +34 -0
  65. data/lib/archsight/web/public/vue/EditorPage-Dq0MuTnp.css +1 -0
  66. data/lib/archsight/web/public/vue/ErrorPage-CQQtPey3.js +2 -0
  67. data/lib/archsight/web/public/vue/ErrorPage-CwPT3JUr.css +1 -0
  68. data/lib/archsight/web/public/vue/GraphView-DRcIqAiR.css +1 -0
  69. data/lib/archsight/web/public/vue/GraphView-T9jFH_qg.js +1 -0
  70. data/lib/archsight/web/public/vue/InstanceRouter-1Sm-CRhf.js +2 -0
  71. data/lib/archsight/web/public/vue/InstanceRouter-BJkDRXZY.css +1 -0
  72. data/lib/archsight/web/public/vue/KindList-JA_L_-Cz.js +1 -0
  73. data/lib/archsight/web/public/vue/ResourceList-8iqavWdg.js +1 -0
  74. data/lib/archsight/web/public/vue/ResourceList-DP-z-j71.css +1 -0
  75. data/lib/archsight/web/public/vue/SearchResults-BGHbg48-.css +1 -0
  76. data/lib/archsight/web/public/vue/SearchResults-BdgFeHcm.js +1 -0
  77. data/lib/archsight/web/public/vue/_basePickBy-CVgieyx-.js +1 -0
  78. data/lib/archsight/web/public/vue/_baseUniq-BNfrOSaP.js +1 -0
  79. data/lib/archsight/web/public/vue/architectureDiagram-VXUJARFQ-CJXNpTr5.js +36 -0
  80. data/lib/archsight/web/public/vue/blockDiagram-VD42YOAC-B5488Hes.js +122 -0
  81. data/lib/archsight/web/public/vue/c4Diagram-YG6GDRKO-eYY3hprM.js +10 -0
  82. data/lib/archsight/web/public/vue/chunk-4BX2VUAB-ZoXeL4D1.js +1 -0
  83. data/lib/archsight/web/public/vue/chunk-55IACEB6-rNtQYnu_.js +1 -0
  84. data/lib/archsight/web/public/vue/chunk-B4BG7PRW-DolAeVV9.js +165 -0
  85. data/lib/archsight/web/public/vue/chunk-DI55MBZ5-DnN0f_hj.js +220 -0
  86. data/lib/archsight/web/public/vue/chunk-FMBD7UC4-BQWOCMuR.js +15 -0
  87. data/lib/archsight/web/public/vue/chunk-QN33PNHL-DId301Kb.js +1 -0
  88. data/lib/archsight/web/public/vue/chunk-QZHKN3VN-xbY0NLgv.js +1 -0
  89. data/lib/archsight/web/public/vue/chunk-TZMSLE5B-CgF9_37b.js +1 -0
  90. data/lib/archsight/web/public/vue/classDiagram-2ON5EDUG-jGlvI-Za.js +1 -0
  91. data/lib/archsight/web/public/vue/classDiagram-v2-WZHVMYZB-jGlvI-Za.js +1 -0
  92. data/lib/archsight/web/public/vue/clone-6iRPe1-W.js +1 -0
  93. data/lib/archsight/web/public/vue/cose-bilkent-S5V4N54A-CB9Zfu50.js +1 -0
  94. data/lib/archsight/web/public/vue/cytoscape.esm-5J0xJHOV.js +321 -0
  95. data/lib/archsight/web/public/vue/dagre-6UL2VRFP-BqkmE-LI.js +4 -0
  96. data/lib/archsight/web/public/vue/diagram-PSM6KHXK-CKBfqtw3.js +24 -0
  97. data/lib/archsight/web/public/vue/diagram-QEK2KX5R-B78rOlvK.js +43 -0
  98. data/lib/archsight/web/public/vue/diagram-S2PKOQOG-BlXC6Cia.js +24 -0
  99. data/lib/archsight/web/public/vue/erDiagram-Q2GNP2WA-BnliyziJ.js +60 -0
  100. data/lib/archsight/web/public/vue/flowDiagram-NV44I4VS-wuqPowTd.js +162 -0
  101. data/lib/archsight/web/public/vue/ganttDiagram-JELNMOA3-GSffAIH3.js +267 -0
  102. data/lib/archsight/web/public/vue/gitGraphDiagram-V2S2FVAM-OA7VyugW.js +65 -0
  103. data/lib/archsight/web/public/vue/graph-BXHAtA0S.js +1 -0
  104. data/lib/archsight/web/public/vue/graphviz-CJms5bxZ.js +13 -0
  105. data/lib/archsight/web/public/vue/index-DsEsN0_K.js +2 -0
  106. data/lib/archsight/web/public/vue/index-Tiu4C-Sb.css +1 -0
  107. data/lib/archsight/web/public/vue/infoDiagram-HS3SLOUP-nlVe2qgv.js +2 -0
  108. data/lib/archsight/web/public/vue/journeyDiagram-XKPGCS4Q-CtTIcKwf.js +139 -0
  109. data/lib/archsight/web/public/vue/kanban-definition-3W4ZIXB7-837KX0sW.js +89 -0
  110. data/lib/archsight/web/public/vue/katex-C-M49wc6.js +261 -0
  111. data/lib/archsight/web/public/vue/layout-DtE0QdL6.js +1 -0
  112. data/lib/archsight/web/public/vue/mermaid-DpPHPFQh.js +250 -0
  113. data/lib/archsight/web/public/vue/mindmap-definition-VGOIOE7T-9gLF2AoY.js +68 -0
  114. data/lib/archsight/web/public/vue/pieDiagram-ADFJNKIX-CyCNgw3u.js +30 -0
  115. data/lib/archsight/web/public/vue/quadrantDiagram-AYHSOK5B-CkPh8g02.js +7 -0
  116. data/lib/archsight/web/public/vue/requirementDiagram-UZGBJVZJ-Dkt6OSlY.js +64 -0
  117. data/lib/archsight/web/public/vue/sankeyDiagram-TZEHDZUN-BqprTk8x.js +10 -0
  118. data/lib/archsight/web/public/vue/sequenceDiagram-WL72ISMW-CTmTe1FQ.js +145 -0
  119. data/lib/archsight/web/public/vue/stateDiagram-FKZM4ZOC-CphqmkEU.js +1 -0
  120. data/lib/archsight/web/public/vue/stateDiagram-v2-4FDKWEC3-CxaDW5sW.js +1 -0
  121. data/lib/archsight/web/public/vue/timeline-definition-IT6M3QCI-CSQUZkyE.js +61 -0
  122. data/lib/archsight/web/public/vue/treemap-GDKQZRPO-DTojm7Yr.js +162 -0
  123. data/lib/archsight/web/public/{css/graph.css → vue/useGraphviz-A5s4h76R.js} +2 -1
  124. data/lib/archsight/web/public/vue/useHighlight-C6Kb5G3l.js +10 -0
  125. data/lib/archsight/web/public/vue/useMermaid-DqxTrLRB.js +1 -0
  126. data/lib/archsight/web/public/vue/usePanZoom-BybZ_rfh.js +11 -0
  127. data/lib/archsight/web/public/vue/xychartDiagram-PRI3JC2R-B1ZJZtDC.js +7 -0
  128. data/lib/archsight/web/public/vue.html +15 -0
  129. data/media/artifact.jpg +0 -0
  130. data/media/service.jpg +0 -0
  131. metadata +104 -77
  132. data/lib/archsight/web/public/css/artifact.css +0 -995
  133. data/lib/archsight/web/public/css/base.css +0 -201
  134. data/lib/archsight/web/public/css/highlight.min.css +0 -10
  135. data/lib/archsight/web/public/css/iconoir.css +0 -22
  136. data/lib/archsight/web/public/css/instance.css +0 -818
  137. data/lib/archsight/web/public/css/layout.css +0 -421
  138. data/lib/archsight/web/public/css/mermaid-layers.css +0 -188
  139. data/lib/archsight/web/public/css/pico.min.css +0 -4
  140. data/lib/archsight/web/public/img/archimate.png +0 -0
  141. data/lib/archsight/web/public/img/togaf-high-level.png +0 -0
  142. data/lib/archsight/web/public/js/graph-zoom.js +0 -18
  143. data/lib/archsight/web/public/js/highlight.min.js +0 -3899
  144. data/lib/archsight/web/public/js/htmx.min.js +0 -1
  145. data/lib/archsight/web/public/js/mermaid-init.js +0 -88
  146. data/lib/archsight/web/public/js/mermaid.min.js +0 -2811
  147. data/lib/archsight/web/public/js/sparkline.js +0 -42
  148. data/lib/archsight/web/public/js/svg-pan-zoom.min.js +0 -3
  149. data/lib/archsight/web/public/js/svg-zoom-controls.js +0 -93
  150. data/lib/archsight/web/views/api_docs.erb +0 -19
  151. data/lib/archsight/web/views/index.haml +0 -12
  152. data/lib/archsight/web/views/partials/artifact/_activity.haml +0 -55
  153. data/lib/archsight/web/views/partials/artifact/_agentic.haml +0 -25
  154. data/lib/archsight/web/views/partials/artifact/_deployment.haml +0 -29
  155. data/lib/archsight/web/views/partials/artifact/_git_info.haml +0 -16
  156. data/lib/archsight/web/views/partials/artifact/_language_stats.haml +0 -53
  157. data/lib/archsight/web/views/partials/artifact/_links.haml +0 -24
  158. data/lib/archsight/web/views/partials/artifact/_project_estimate.haml +0 -32
  159. data/lib/archsight/web/views/partials/artifact/_repositories.haml +0 -55
  160. data/lib/archsight/web/views/partials/artifact/_team.haml +0 -83
  161. data/lib/archsight/web/views/partials/artifact/_workflow.haml +0 -69
  162. data/lib/archsight/web/views/partials/components/_activity.haml +0 -37
  163. data/lib/archsight/web/views/partials/components/_git.haml +0 -17
  164. data/lib/archsight/web/views/partials/components/_jira.haml +0 -18
  165. data/lib/archsight/web/views/partials/components/_languages.haml +0 -29
  166. data/lib/archsight/web/views/partials/components/_owner.haml +0 -15
  167. data/lib/archsight/web/views/partials/components/_repositories.haml +0 -37
  168. data/lib/archsight/web/views/partials/components/_status.haml +0 -23
  169. data/lib/archsight/web/views/partials/instance/_analysis_detail.haml +0 -74
  170. data/lib/archsight/web/views/partials/instance/_analysis_result.haml +0 -64
  171. data/lib/archsight/web/views/partials/instance/_detail.haml +0 -103
  172. data/lib/archsight/web/views/partials/instance/_graph.haml +0 -6
  173. data/lib/archsight/web/views/partials/instance/_import_detail.haml +0 -87
  174. data/lib/archsight/web/views/partials/instance/_list.haml +0 -84
  175. data/lib/archsight/web/views/partials/instance/_relations.haml +0 -43
  176. data/lib/archsight/web/views/partials/instance/_requirements.haml +0 -41
  177. data/lib/archsight/web/views/partials/instance/_view_detail.haml +0 -57
  178. data/lib/archsight/web/views/partials/layout/_content.haml +0 -44
  179. data/lib/archsight/web/views/partials/layout/_error.haml +0 -22
  180. data/lib/archsight/web/views/partials/layout/_head.haml +0 -24
  181. data/lib/archsight/web/views/partials/layout/_navigation.haml +0 -21
  182. data/lib/archsight/web/views/partials/layout/_sidebar.haml +0 -27
  183. data/lib/archsight/web/views/search.haml +0 -53
  184. /data/{lib/archsight/web/doc → docs}/archimate.md +0 -0
  185. /data/{lib/archsight/web/doc → docs}/computed_annotations.md +0 -0
  186. /data/{lib/archsight/web/doc → docs}/icons.md +0 -0
  187. /data/{lib/archsight/web/doc → docs}/modeling.md +0 -0
  188. /data/{lib/archsight/web/doc → docs}/search.md +0 -0
  189. /data/{lib/archsight/web/doc → docs}/togaf.md +0 -0
  190. /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: ae63f749045a2339cdabe1cb1136ec0078ac1b62d75c0c3fb1c6707c8317f025
4
- data.tar.gz: 61fd3a424e8943314724a044089aa79a696af34f6529f3c6116f2cf411d5167d
3
+ metadata.gz: 750620aa30b68f0a3cfa0f53be2d717ae0496b829e5ecc588a904b3bf39dbd10
4
+ data.tar.gz: 8ddf46b557c7830212d0e699149ce2b53b9476c7748fc90c82480f22be226047
5
5
  SHA512:
6
- metadata.gz: 5bd774f6c2c04f358b0ff43f2c4729d70e23f0adb03f0baccde2c81e5eb91b809f1b04d5fdcd8f1ac6a460d1b00731684c63b4d8fa03d1533947240f0da799d7
7
- data.tar.gz: bfabe9ef2312bf3c243b52679a09dbb57ed5048d757bc5267479ad83d1242d61b2543d85e9be6cdfcf45f14602e0a8ba174b6a75444334be5a446103eb4d4ab6
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
+ | ![Service detail with graph and relations](media/service.jpg) | ![Artifact detail with metadata](media/artifact.jpg) |
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
- ### Option 2: Docker
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](lib/archsight/web/doc/search.md)
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](lib/archsight/web/doc/modeling.md) | How to model architecture using resource types and relations |
154
- | [Query Language](lib/archsight/web/doc/search.md) | Full query syntax reference for searching resources |
155
- | [Computed Annotations](lib/archsight/web/doc/computed_annotations.md) | Aggregating values across relations |
156
- | [ArchiMate Reference](lib/archsight/web/doc/archimate.md) | ArchiMate concepts and mapping |
157
- | [TOGAF Reference](lib/archsight/web/doc/togaf.md) | TOGAF alignment and concepts |
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
- ### Technology Stack
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,6 @@
1
+ apiVersion: v2
2
+ name: archsight
3
+ description: A Helm chart for ArchSight
4
+ type: application
5
+ version: 0.1.1
6
+ appVersion: "0.1.4"
@@ -0,0 +1,3 @@
1
+ # Archsight Helm Chart
2
+
3
+ See the full documentation at [docs/kubernetes.md](../../docs/kubernetes.md).
@@ -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 }}