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
@@ -1,84 +0,0 @@
1
- -# Parameters:
2
- -# instances: Array of resource instances to display
3
- -# omit_kind: Boolean - hide kind column (default: false)
4
- -# fields: Array of annotation keys to display as columns (optional, overrides list_annotations)
5
- - omit_kind ||= false
6
- - fields ||= nil
7
- - if instances.nil? || instances.empty?
8
- %p.empty-state
9
- %i No resources found
10
- - else
11
- - sample_class = instances.first.class
12
- -# Determine which annotations to show as columns
13
- - if fields
14
- -# Use provided fields - convert to annotation-like objects
15
- -# Always create wrapper with the actual field key to ensure correct value lookups
16
- -# (pattern annotations like scc/language/*/loc have the pattern as key, not the actual field)
17
- - field_annotation = Struct.new(:key, :title, :description, :type)
18
- - list_annotations = fields.map do |field|
19
- - if field.start_with?('@')
20
- -# Component field - renders a partial from partials/components/
21
- - component_name = field[1..-1]
22
- - field_annotation.new(field, component_name.capitalize, "Component: #{component_name}", :component)
23
- - else
24
- - annotation_def = sample_class.annotation_matching(field)
25
- - segments = field.split('/')
26
- -# Generate title: for paths like scc/language/C/loc, use "C Loc" (language name + last segment)
27
- - if segments.length >= 2
28
- - title = "#{segments[-2]} #{segments[-1]}".split(/(?=[A-Z])/).map(&:capitalize).join(' ')
29
- - else
30
- - title = segments.last.split(/(?=[A-Z])/).map(&:capitalize).join(' ')
31
- - field_annotation.new(field, title, annotation_def&.description, annotation_def&.type)
32
- - list_annotations.compact!
33
- - elsif omit_kind
34
- -# Auto-detect from list: true annotations
35
- - list_annotations = sample_class.list_annotations
36
- - if list_annotations.empty?
37
- - tags_annotation = sample_class.annotation_matching('architecture/tags')
38
- - list_annotations = [tags_annotation] if tags_annotation
39
- - else
40
- - list_annotations = []
41
- - if list_annotations.any?
42
- %table.resource-list-table
43
- %thead
44
- %tr
45
- %th.col-name Name
46
- - unless omit_kind
47
- %th.col-kind Kind
48
- - list_annotations.each do |annotation|
49
- %th.col-annotation{title: annotation.description}= annotation.title
50
- %tbody
51
- - instances.each do |instance|
52
- %tr.resource-list-row
53
- %td.col-name
54
- %a.instance-name{href: "/kinds/#{instance.klass}/instances/#{instance.name}"}
55
- %i{class: "iconoir-#{instance.class.icon} icon-#{instance.class.layer}"}
56
- = instance.name
57
- - unless omit_kind
58
- %td.col-kind
59
- %span.instance-kind= instance.klass
60
- - list_annotations.each do |annotation|
61
- %td.col-annotation
62
- - if annotation.type == :component
63
- - component_name = annotation.key[1..-1]
64
- != haml :"partials/components/_#{component_name}", locals: { instance: instance }
65
- - else
66
- - value = instance.annotations[annotation.key] || instance.computed_annotation_value(annotation.key)
67
- - if value
68
- - if annotation.type == Time
69
- - time_value = value.is_a?(Time) ? value : Time.parse(value.to_s)
70
- %span{title: time_value.strftime("%Y-%m-%d %H:%M:%S")}= time_ago(value)
71
- - else
72
- = value
73
- - else
74
- %span.empty-value —
75
- - else
76
- %ul.search-instance-list
77
- - instances.each do |instance|
78
- %li.search-instance-item
79
- .instance-main
80
- %a.instance-name{href: "/kinds/#{instance.klass}/instances/#{instance.name}"}
81
- %i{ class: "iconoir-#{instance.class.icon} icon-#{instance.class.layer}" }
82
- = instance.name
83
- - unless omit_kind
84
- %span.instance-kind= instance.klass
@@ -1,43 +0,0 @@
1
- - return unless instance.has_relations? || instance.references.any?
2
- %article.relations-section
3
- %header
4
- %h2 Relations
5
- .relations-grid
6
- .relations-column.relations-outgoing
7
- %h3
8
- Outgoing
9
- %i.iconoir-arrow-right
10
- - if instance.has_relations?
11
- - instance.relations_grouped.each do |verb, kinds|
12
- - kinds.each do |kind, instances|
13
- - kind_class = Archsight::Resources[kind]
14
- .relation-group
15
- .relation-kind
16
- %i{class: "iconoir-#{kind_class&.icon || 'cube'} icon-#{kind_class&.layer || 'technology'}"}
17
- %span= "#{kind} (#{instances.size})"
18
- .relation-verb= "#{verb} (#{instances.size})"
19
- .instance-badges
20
- - instances.sort_by(&:name).each do |item|
21
- %a.badge.badge-info{href: "/kinds/#{item.klass}/instances/#{item.name}"}
22
- = item.name
23
- - else
24
- .relations-empty None
25
- .relations-column.relations-incoming
26
- %h3
27
- %i.iconoir-arrow-right
28
- Incoming
29
- - if instance.references.any?
30
- - instance.references_grouped.each do |kind, verbs|
31
- - kind_class = Archsight::Resources[kind]
32
- - verbs.each do |verb, instances|
33
- .relation-group
34
- .relation-kind
35
- %i{class: "iconoir-#{kind_class&.icon || 'cube'} icon-#{kind_class&.layer || 'technology'}"}
36
- %span= "#{kind} (#{instances.size})"
37
- .relation-verb= "#{verb || 'references'} (#{instances.size})"
38
- .instance-badges
39
- - instances.sort_by(&:name).each do |item|
40
- %a.badge.badge-info{ href: "/kinds/#{item.klass}/instances/#{item.name}" }
41
- = item.name
42
- - else
43
- .relations-empty None
@@ -1,41 +0,0 @@
1
- - return unless instance
2
- - realized = instance.relations(:realizes, :businessRequirements).map { |r| [r, 'implemented'] }
3
- - partial = instance.relations(:partiallyRealizes, :businessRequirements).map { |r| [r, 'partial'] }
4
- - planned = instance.relations(:plans, :businessRequirements).map { |r| [r, 'planned'] }
5
- - all_requirements = realized + partial + planned
6
- - if all_requirements.any?
7
- %article.requirements-section
8
- %header
9
- %h2 Business Requirements
10
- %table.requirements-table
11
- %thead
12
- %tr
13
- %th
14
- %th Name
15
- %th Priority
16
- %th Story
17
- %tbody
18
- - all_requirements.each do |req, status|
19
- - status_icon = case status
20
- - when 'implemented' then 'check-circle'
21
- - when 'partial' then 'half-moon'
22
- - when 'planned' then 'calendar'
23
- - else 'circle'
24
- - status_title = status.capitalize
25
- %tr
26
- %td.requirement-status
27
- %i.requirement-status-icon{class: "iconoir-#{status_icon} status-#{status}", title: status_title}
28
- %td
29
- %a{href: "/kinds/BusinessRequirement/instances/#{req.name}"}= req.name
30
- %td
31
- - priority = req.annotations["requirement/priority"]
32
- - if priority
33
- %a.badge.badge-info{**search_link_attrs("BusinessRequirement: <- \"#{instance.name}\" & requirement/priority == \"#{priority}\"")}= priority
34
- - else
35
- %span.view-empty-value -
36
- %td.requirement-story
37
- - story = req.annotations["requirement/story"]
38
- - if story
39
- != markdown(story)
40
- - else
41
- %span.view-empty-value -
@@ -1,57 +0,0 @@
1
- - view_instance = db.instance_by_kind(@kind, @instance)
2
- - return unless view_instance
3
- - view_query = view_instance.annotations['view/query']
4
- - view_description = view_instance.annotations['architecture/description']
5
- - view_fields_raw = view_instance.annotations['view/fields'] || ''
6
- - view_fields = view_fields_raw.split(',').map(&:strip).reject(&:empty?)
7
- - view_type = view_instance.annotations['view/type'] || 'list:name+kind'
8
- - show_kind = view_type == 'list:name+kind'
9
- - view_sort_raw = view_instance.annotations['view/sort'] || ''
10
- - view_sort_fields = view_sort_raw.split(',').map(&:strip).reject(&:empty?)
11
-
12
- %article.view-header
13
- %header
14
- %h2
15
- %i{class: "iconoir-#{view_instance.class.icon} icon-#{view_instance.class.layer}"}
16
- = @instance
17
- - if view_description
18
- .view-description
19
- != markdown(view_description)
20
- - if view_query
21
- .view-query-display
22
- %p.query-item
23
- %span.label Query:
24
- %code.query-value= view_query
25
-
26
- - if view_query
27
- - begin
28
- - start_time = Time.now
29
- - parsed_query = Archsight::Query.parse(view_query)
30
- - results = parsed_query.filter(db)
31
- - results = sort_instances(results, view_sort_fields)
32
- - search_time_ms = ((Time.now - start_time) * 1000).round(2)
33
- -# Hide kind if view_type is not 'list:name+kind' OR if query filters by a specific kind (redundant)
34
- - show_kind = show_kind && parsed_query.kind_filter.nil?
35
-
36
- %article.view-results
37
- %header
38
- %h3 Results
39
- %span.view-result-meta
40
- = results.size
41
- = results.size == 1 ? "item" : "items"
42
- in #{search_time_ms} ms
43
-
44
- != haml :"partials/instance/_list", locals: { instances: results, omit_kind: !show_kind, fields: view_fields.any? ? view_fields : nil }
45
-
46
- - rescue Archsight::Query::QueryError => e
47
- .search-error
48
- .search-error-header
49
- %i.iconoir-warning-triangle
50
- Query Error
51
- .search-error-message= e.message
52
- .search-error-query
53
- Query:
54
- %code= view_query
55
- - else
56
- %p.view-empty-state
57
- %em No query defined
@@ -1,44 +0,0 @@
1
- .content
2
- - if @doc_content
3
- %article
4
- != @doc_content
5
- - elsif @instances
6
- != haml :search
7
- - elsif @kind && @instance
8
- - if !Archsight::Resources[@kind]
9
- %article
10
- %header
11
- %h2 Kind Not Found
12
- %p
13
- Kind
14
- %strong= @kind
15
- does not exist.
16
- - elsif @kind == "View"
17
- != haml :'partials/instance/_view_detail'
18
- - elsif @kind == "Analysis"
19
- != haml :'partials/instance/_analysis_detail'
20
- - elsif @kind == "Import"
21
- != haml :'partials/instance/_import_detail'
22
- - else
23
- != haml :'partials/instance/_detail'
24
- - elsif @kind && !@instance
25
- - if !Archsight::Resources[@kind]
26
- %article
27
- %header
28
- %h2 Kind Not Found
29
- %p
30
- Kind
31
- %strong= @kind
32
- does not exist.
33
- - else
34
- - kind_snake = @kind.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
35
- %article
36
- %header
37
- %h2
38
- %i{class: "iconoir-#{Archsight::Resources[@kind].icon} icon-#{Archsight::Resources[@kind].layer}"}
39
- = @kind
40
- %a.kind-help{href: "/doc/resources/#{kind_snake}", title: "Documentation for #{@kind}"}
41
- %i.iconoir-help-circle
42
- != haml :"partials/instance/_list", locals: { instances: db.instances_by_kind(@kind).values.sort_by(&:name), omit_kind: true }
43
- - elsif !@kind
44
- != haml :"partials/instance/_graph"
@@ -1,22 +0,0 @@
1
- %header.container
2
- %article.error-header
3
- %h3
4
- %i.iconoir-warning-triangle
5
- Error
6
- %p.error-message= @error.message
7
- %p.error-location
8
- %i.iconoir-page
9
- = relative_error_path(@error.ref.path)
10
- %span.error-line-badge Line #{@error.ref.line_no}
11
- %a.reload-btn{href: "/reload?redirect=#{params["redirect"]}"}
12
- %i.iconoir-refresh
13
- Reload
14
-
15
- %main.container
16
- .error-code-block
17
- %pre
18
- %code
19
- - error_context_lines(@error.ref.path, @error.ref.line_no).each do |line|
20
- - line_class = line[:selected] ? "error-line" : "code-line"
21
- - escaped_content = ERB::Util.html_escape(line[:content])
22
- != "<span class='#{line_class}'><span class='line-number'>#{line[:line_no].to_s.rjust(4)}</span>#{escaped_content}</span>\n"
@@ -1,24 +0,0 @@
1
- %head
2
- %meta{content: 'text/html; charset=UTF-8', 'http-equiv' => 'Content-Type'}/
3
- %meta{charset: 'UTF-8'}/
4
- %meta{content: 'width=device-width, initial-scale=1', name: 'viewport'}/
5
- %title IONOS Architecture
6
- %link{href: asset_path('/css/pico.min.css'), rel: 'stylesheet'}/
7
- %link{href: asset_path('/css/base.css'), rel: 'stylesheet'}/
8
- %link{href: asset_path('/css/layout.css'), rel: 'stylesheet'}/
9
- %link{href: asset_path('/css/instance.css'), rel: 'stylesheet'}/
10
- %link{href: asset_path('/css/artifact.css'), rel: 'stylesheet'}/
11
- %link{href: asset_path('/css/iconoir.css'), rel: 'stylesheet'}/
12
- %link{href: asset_path('/css/highlight.min.css'), rel: 'stylesheet'}/
13
- %link{href: asset_path('/css/mermaid-layers.css'), rel: 'stylesheet'}/
14
- %link{href: asset_path('/css/graph.css'), rel: 'stylesheet'}/
15
- %script{src: asset_path('/js/htmx.min.js')}
16
- %script{src: asset_path('/js/mermaid.min.js')}
17
- %script{src: asset_path('/js/svg-pan-zoom.min.js')}
18
- %script{src: asset_path('/js/svg-zoom-controls.js')}
19
- %script{src: asset_path('/js/graph-zoom.js')}
20
- %script{src: asset_path("/js/mermaid-init.js")}
21
- %script{ src: asset_path("/js/highlight.min.js") }
22
- %script{ src: asset_path("/js/sparkline.js") }
23
- :javascript
24
- hljs.highlightAll();
@@ -1,21 +0,0 @@
1
- %nav.container-fluid
2
- %ul
3
- %li
4
- %strong
5
- %a{href: "/"}
6
- %i.iconoir-home
7
- Archsight
8
- - if reload_enabled?
9
- %li
10
- %a{href: "/reload?redirect=#{request.path_info}"}
11
- %i.iconoir-reload-window
12
- Reload
13
- %ul
14
- %li.search-container
15
- %a.search-help{ href: "/doc/index", "hx-get": "/doc/index", "hx-target": ".content", "hx-swap": "innerHTML", "hx-push-url": "true", title: "Help" }
16
- %i.iconoir-help-circle
17
- %input#search-input.search{ placeholder: "Query: kubernetes, activity/status == \"active\"", name: "q",
18
- "hx-post": "/search", "hx-swap": "innerHTML", "hx-target": ".content",
19
- "hx-indicator": ".search-spinner" }
20
- %span.search-spinner.htmx-indicator
21
- %i.iconoir-refresh.spinning
@@ -1,27 +0,0 @@
1
- %aside.sidebar
2
- .sidebar-section
3
- %h4.sidebar-heading
4
- %i.iconoir-folder
5
- Kinds
6
- %nav.kind-filter
7
- %ul
8
- - Archsight::Resources.each do |item|
9
- %li
10
- %a{href: "/kinds/#{item}", 'aria-current': (item.to_s == @kind ? "page" : nil)}
11
- %span.kind-name= item
12
- %span.kind-count= db.instances_by_kind(item).each_key.size
13
- - if @kind
14
- - filters = db.filters_for_kind(@kind)
15
- - if filters.any?
16
- .sidebar-section
17
- %h4.sidebar-heading
18
- %i.iconoir-filter
19
- Filters
20
- %nav.annotation-filter
21
- - filters.each do |annotation, values|
22
- .filter-group
23
- .filter-label{title: annotation.description}= annotation.title
24
- .filter-chips
25
- - values.each do |value|
26
- %a.filter-chip{ **filter_link_attrs(annotation.key, value, "==", @kind) }
27
- = value
@@ -1,53 +0,0 @@
1
- - if @query_error
2
- .search-error
3
- .search-error-header
4
- %i.iconoir-warning-triangle
5
- Query Syntax Error
6
- .search-error-message= @query_error.message
7
- .search-error-query
8
- Query:
9
- %code= @q
10
-
11
- %article.search-context
12
- %header
13
- %h3 Search Query
14
- .search-query-display
15
- %p.query-item
16
- %span.label Query:
17
- %code.query-value= @q
18
- - if @tag
19
- - new_method = @method == '==' ? '!=' : '=='
20
- - title_text = @method == '==' ? "Switch to != (NOT equal)" : "Switch to == (equal)"
21
- - attrs = filter_link_attrs(@tag, @value, new_method, @kind).merge(title: title_text)
22
- %a.link-light.query-toggle{**attrs}
23
- %i.iconoir-flip
24
- - if @kind
25
- %p.query-item
26
- %span.label Kind:
27
- %code.kind-value= @kind
28
- - unless @query_error
29
- %p.query-item
30
- %span.label Results:
31
- %span.result-count
32
- = (@instances || []).size
33
- = (@instances || []).size == 1 ? "item" : "items"
34
- %p.query-item
35
- %span.label Time:
36
- %span.search-time= "#{@search_time_ms} ms"
37
-
38
- - unless @query_error
39
- %article.search-results
40
- %header
41
- %h3 Results
42
- - if (@instances || []).empty?
43
- %p
44
- %em No results found
45
- - else
46
- != haml :"partials/instance/_list", locals: { instances: @instances, omit_kind: !@kind.nil? }
47
-
48
- -# Out-of-band swap to update search input with current query
49
- %input#search-input.search{ placeholder: "Query: kubernetes, activity/status == \"active\"", name: "q",
50
- value: @q,
51
- "hx-post": "/search", "hx-swap": "innerHTML", "hx-target": ".content",
52
- "hx-indicator": ".search-spinner",
53
- "hx-swap-oob": "true" }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes