@cloudcare/guance-front-tools 1.0.20 → 1.0.21

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 (185) hide show
  1. package/README.md +0 -64
  2. package/lib/cjs/generated/dashboardCharts.d.ts +172 -69
  3. package/lib/cjs/scripts/convert-grafana-dashboard-core.js +417 -56
  4. package/lib/esm/generated/dashboardCharts.d.ts +172 -69
  5. package/lib/esm/scripts/convert-grafana-dashboard-core.js +417 -56
  6. package/lib/example/1860_rev45.json +15536 -0
  7. package/lib/example/guance-dashboard.json +16766 -2702
  8. package/lib/scripts/convert-grafana-dashboard-core.js +1899 -1633
  9. package/package.json +1 -1
  10. package/schemas/charts/chart-schema.json +711 -1
  11. package/schemas/charts/settings/_common-settings-gradual-color-schema.json +17 -3
  12. package/schemas/charts/settings/_common-settings-legend-values-schema.json +23 -15
  13. package/{skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-treemap-settings-schema.json → schemas/charts/settings/chart-change-settings-schema.json} +34 -32
  14. package/schemas/charts/settings/chart-chinamap-settings-schema.json +2 -1
  15. package/schemas/charts/settings/chart-command-settings-schema.json +16 -0
  16. package/schemas/charts/settings/chart-hexgon-settings-schema.json +2 -1
  17. package/{skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-log-settings-schema.json → schemas/charts/settings/chart-monitor-settings-schema.json} +27 -30
  18. package/schemas/charts/settings/chart-sequence-settings-schema.json +2 -3
  19. package/schemas/charts/settings/chart-topology-settings-schema.json +1 -6
  20. package/schemas/charts/settings/chart-video-settings-schema.json +45 -0
  21. package/schemas/charts/settings/chart-worldmap-settings-schema.json +2 -1
  22. package/schemas/charts/settings/settings-alias-schema.json +14 -1
  23. package/schemas/charts/settings/settings-compare-schema.json +20 -12
  24. package/schemas/charts/settings/settings-schema.json +13 -1
  25. package/schemas/charts/settings/settings-time-schema.json +38 -23
  26. package/schemas/charts/settings/settings-unit-items-schema.json +222 -210
  27. package/schemas/charts/settings/settings-units-schema.json +0 -3
  28. package/test/cli.test.mjs +66 -44
  29. package/skills/grafana-to-guance-dashboard/SKILL.md +0 -490
  30. package/skills/grafana-to-guance-dashboard/agents/openai.yaml +0 -4
  31. package/skills/grafana-to-guance-dashboard/fixtures/grafana-dashboard.guance.json +0 -1029
  32. package/skills/grafana-to-guance-dashboard/fixtures/grafana-dashboard.json +0 -878
  33. package/skills/grafana-to-guance-dashboard/package.json +0 -16
  34. package/skills/grafana-to-guance-dashboard/references/conversion-audit-checklist.md +0 -183
  35. package/skills/grafana-to-guance-dashboard/references/converter-notes.md +0 -244
  36. package/skills/grafana-to-guance-dashboard/references/promql-compatibility-cheatsheet.md +0 -172
  37. package/skills/grafana-to-guance-dashboard/references/unit-inference-cheatsheet.md +0 -174
  38. package/skills/grafana-to-guance-dashboard/schemas/charts/chart-schema.json +0 -84
  39. package/skills/grafana-to-guance-dashboard/schemas/charts/common/chart-link-item-schema.json +0 -48
  40. package/skills/grafana-to-guance-dashboard/schemas/charts/common/chart-links-schema.json +0 -9
  41. package/skills/grafana-to-guance-dashboard/schemas/charts/common/common-chart-types-schema.json +0 -39
  42. package/skills/grafana-to-guance-dashboard/schemas/charts/common/common-vars-item-schema.json +0 -117
  43. package/skills/grafana-to-guance-dashboard/schemas/charts/common/common-vars-schema.json +0 -10
  44. package/skills/grafana-to-guance-dashboard/schemas/charts/dashboard-schema.json +0 -80
  45. package/skills/grafana-to-guance-dashboard/schemas/charts/query/queries-schema.json +0 -10
  46. package/skills/grafana-to-guance-dashboard/schemas/charts/query/query-item-schema.json +0 -60
  47. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-connect-null-schema.json +0 -7
  48. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-gradual-color-schema.json +0 -72
  49. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-groupby-schema.json +0 -22
  50. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-legend-position-schema.json +0 -14
  51. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-legend-values-schema.json +0 -19
  52. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-open-stack-schema.json +0 -8
  53. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-show-label-schema.json +0 -8
  54. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-show-line-schema.json +0 -8
  55. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-stack-content-schema.json +0 -12
  56. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/_common-settings-stack-type-schema.json +0 -11
  57. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-alarm-settings-schema.json +0 -48
  58. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-bar-settings-schema.json +0 -69
  59. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-chinamap-settings-schema.json +0 -102
  60. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-funnel-settings-schema.json +0 -34
  61. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-gauge-settings-schema.json +0 -65
  62. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-heatmap-settings-schema.json +0 -50
  63. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-hexgon-settings-schema.json +0 -90
  64. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-histogram-settings-schema.json +0 -47
  65. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-iframe-settings-schema.json +0 -24
  66. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-object-settings-schema.json +0 -52
  67. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-picture-settings-schema.json +0 -46
  68. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-pie-settings-schema.json +0 -90
  69. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-sankey-settings-schema.json +0 -34
  70. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-scatter-bubble-settings-schema.json +0 -31
  71. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-sequence-settings-schema.json +0 -76
  72. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-singlestat-settings-schema.json +0 -163
  73. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-table-settings-schema.json +0 -184
  74. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-text-settings-schema.json +0 -20
  75. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-toplist-settings-schema.json +0 -117
  76. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-topology-settings-schema.json +0 -71
  77. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/chart-worldmap-settings-schema.json +0 -102
  78. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/common-settings-schema.json +0 -82
  79. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-alias-schema.json +0 -47
  80. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-chart-type-schema.json +0 -27
  81. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-colors-schema.json +0 -46
  82. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-compare-schema.json +0 -58
  83. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-fixed-time-schema.json +0 -49
  84. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-levels-schema.json +0 -33
  85. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-schema.json +0 -79
  86. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-time-schema.json +0 -43
  87. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-unit-items-schema.json +0 -228
  88. package/skills/grafana-to-guance-dashboard/schemas/charts/settings/settings-units-schema.json +0 -59
  89. package/skills/grafana-to-guance-dashboard/schemas/dashboard-schema.json +0 -5
  90. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/attribute-mutation-schema.json +0 -21
  91. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/attributes-schema.json +0 -10
  92. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/cdata-node-schema.json +0 -19
  93. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/creation-reason-schema.json +0 -17
  94. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/document-fragment-node-schema.json +0 -35
  95. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/document-node-schema.json +0 -30
  96. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/document-type-node-schema.json +0 -28
  97. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/element-node-schema.json +0 -33
  98. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/frustration-record-schema.json +0 -49
  99. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/full-snapshot-record-schema.json +0 -26
  100. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/incremental-data-schema.json +0 -36
  101. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/incremental-snapshot-record-schema.json +0 -29
  102. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/input-data-schema.json +0 -27
  103. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/input-state-schema.json +0 -27
  104. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/media-interaction-data-schema.json +0 -23
  105. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/media-interaction-schema.json +0 -20
  106. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/mouse-interaction-data-schema.json +0 -23
  107. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/mouse-interaction-schema.json +0 -47
  108. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/mouse-move-data-schema.json +0 -23
  109. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/mouse-position-schema.json +0 -26
  110. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/mutation-data-schema.json +0 -23
  111. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/mutation-payload-schema.json +0 -42
  112. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/node-added-mutation-schema.json +0 -41
  113. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/node-removed-mutation-schema.json +0 -18
  114. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/node-schema.json +0 -28
  115. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/record-schema.json +0 -30
  116. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/scroll-data-schema.json +0 -23
  117. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/scroll-position-schema.json +0 -22
  118. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/segment-metadata-schema.json +0 -28
  119. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/segment-schema.json +0 -25
  120. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/serialized-node-schema.json +0 -15
  121. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/serialized-node-with-id-schema.json +0 -21
  122. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/stylesheet-rule-add-schema.json +0 -28
  123. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/stylesheet-rule-data-schema.json +0 -23
  124. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/stylesheet-rule-delete-schema.json +0 -24
  125. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/stylesheet-rule-schema.json +0 -29
  126. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/stylesheet-schema.json +0 -30
  127. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/text-mutation-schema.json +0 -27
  128. package/skills/grafana-to-guance-dashboard/schemas/session-replay/browser/text-node-schema.json +0 -23
  129. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/_common-record-schema.json +0 -14
  130. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/_common-segment-metadata-schema.json +0 -30
  131. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/_slot-supported-common-record-schema.json +0 -21
  132. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/focus-record-schema.json +0 -34
  133. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/meta-record-schema.json +0 -42
  134. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/pointer-interaction-data-schema.json +0 -23
  135. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/pointer-interaction-schema.json +0 -34
  136. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/segment-context-schema.json +0 -46
  137. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/view-end-record-schema.json +0 -23
  138. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/viewport-resize-data-schema.json +0 -23
  139. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/viewport-resize-dimension-schema.json +0 -18
  140. package/skills/grafana-to-guance-dashboard/schemas/session-replay/common/visual-viewport-record-schema.json +0 -50
  141. package/skills/grafana-to-guance-dashboard/schemas/session-replay/full-snapshot-record-schema.json +0 -14
  142. package/skills/grafana-to-guance-dashboard/schemas/session-replay/incremental-data-schema.json +0 -14
  143. package/skills/grafana-to-guance-dashboard/schemas/session-replay/incremental-snapshot-record-schema.json +0 -14
  144. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/_common-shape-wireframe-schema.json +0 -22
  145. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/_common-shape-wireframe-update-schema.json +0 -22
  146. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/_common-wireframe-schema.json +0 -38
  147. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/_common-wireframe-update-schema.json +0 -38
  148. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/full-snapshot-record-schema.json +0 -38
  149. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/image-wireframe-schema.json +0 -43
  150. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/image-wireframe-update-schema.json +0 -43
  151. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/incremental-data-schema.json +0 -21
  152. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/incremental-snapshot-record-schema.json +0 -26
  153. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/mutation-data-schema.json +0 -23
  154. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/mutation-payload-schema.json +0 -55
  155. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/placeholder-wireframe-schema.json +0 -28
  156. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/placeholder-wireframe-update-schema.json +0 -28
  157. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/record-schema.json +0 -27
  158. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/segment-metadata-schema.json +0 -25
  159. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/segment-schema.json +0 -25
  160. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/shape-border-schema.json +0 -25
  161. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/shape-style-schema.json +0 -29
  162. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/shape-wireframe-schema.json +0 -23
  163. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/shape-wireframe-update-schema.json +0 -23
  164. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/text-position-schema.json +0 -57
  165. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/text-style-schema.json +0 -31
  166. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/text-wireframe-schema.json +0 -34
  167. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/text-wireframe-update-schema.json +0 -34
  168. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/touch-data-schema.json +0 -51
  169. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/webview-wireframe-schema.json +0 -33
  170. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/webview-wireframe-update-schema.json +0 -33
  171. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/wireframe-clip-schema.json +0 -29
  172. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/wireframe-schema.json +0 -24
  173. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mobile/wireframe-update-mutation-schema.json +0 -24
  174. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mutation-data-schema.json +0 -14
  175. package/skills/grafana-to-guance-dashboard/schemas/session-replay/mutation-payload-schema.json +0 -14
  176. package/skills/grafana-to-guance-dashboard/schemas/session-replay/record-schema.json +0 -14
  177. package/skills/grafana-to-guance-dashboard/schemas/session-replay/segment-metadata-schema.json +0 -14
  178. package/skills/grafana-to-guance-dashboard/schemas/session-replay/segment-schema.json +0 -15
  179. package/skills/grafana-to-guance-dashboard/schemas/session-replay-browser-schema.json +0 -5
  180. package/skills/grafana-to-guance-dashboard/schemas/session-replay-mobile-schema.json +0 -5
  181. package/skills/grafana-to-guance-dashboard/schemas/session-replay-schema.json +0 -33
  182. package/skills/grafana-to-guance-dashboard/scripts/convert-grafana-dashboard-core.js +0 -1675
  183. package/skills/grafana-to-guance-dashboard/scripts/convert-grafana-dashboard.mjs +0 -120
  184. package/skills/grafana-to-guance-dashboard/scripts/validate-file.mjs +0 -62
  185. package/skills/grafana-to-guance-dashboard/test/convert.test.mjs +0 -54
package/test/cli.test.mjs CHANGED
@@ -10,19 +10,22 @@ import { fileURLToPath, pathToFileURL } from 'node:url'
10
10
  import { covert } from '../lib/scripts/grafana-covert-to-guance-core.js'
11
11
  import {
12
12
  convertDashboard,
13
- } from '../skills/grafana-to-guance-dashboard/scripts/convert-grafana-dashboard.mjs'
13
+ main as convertCliMain,
14
+ validateDashboardFile,
15
+ } from '../lib/scripts/convert-grafana-dashboard.js'
14
16
 
15
17
  const __filename = fileURLToPath(import.meta.url)
16
18
  const __dirname = path.dirname(__filename)
17
19
  const projectRoot = path.resolve(__dirname, '..')
18
20
  const require = createRequire(import.meta.url)
19
21
  const cliPath = path.join(projectRoot, 'cli.js')
20
- const skillCliPath = path.join(
22
+ const converterCliPath = path.join(
21
23
  projectRoot,
22
- 'skills/grafana-to-guance-dashboard/scripts/convert-grafana-dashboard.mjs'
24
+ 'lib/scripts/convert-grafana-dashboard.js'
23
25
  )
24
26
  const grafanaInputPath = path.join(projectRoot, 'lib/example/test2.json')
25
27
  const grafanaLoadInputPath = path.join(projectRoot, 'lib/example/grafana2.json')
28
+ const grafanaNodeExporterInputPath = path.join(projectRoot, 'lib/example/1860_rev45.json')
26
29
 
27
30
  function runCli(args, options = {}) {
28
31
  return spawnSync(process.execPath, [cliPath, ...args], {
@@ -32,10 +35,20 @@ function runCli(args, options = {}) {
32
35
  })
33
36
  }
34
37
 
35
- function runSkillCli(args, options = {}) {
36
- return spawnSync(process.execPath, [skillCliPath, ...args], {
38
+ function runConverterCli(args, options = {}) {
39
+ const evalSource = [
40
+ "import { main } from './lib/scripts/convert-grafana-dashboard.js'",
41
+ `process.argv = ['node', '${converterCliPath.replace(/\\/g, '\\\\')}', ...JSON.parse(process.env.GUANCE_TEST_ARGS || '[]')]`,
42
+ 'main()',
43
+ ].join('; ')
44
+
45
+ return spawnSync(process.execPath, ['--input-type=module', '-e', evalSource], {
37
46
  cwd: projectRoot,
38
47
  encoding: 'utf-8',
48
+ env: {
49
+ ...process.env,
50
+ GUANCE_TEST_ARGS: JSON.stringify(args),
51
+ },
39
52
  ...options,
40
53
  })
41
54
  }
@@ -53,14 +66,13 @@ test('covert delegates to the shared converter implementation', () => {
53
66
  assert.deepEqual(actual, expected)
54
67
  })
55
68
 
56
- test('published esm converter entry does not depend on skills path', async () => {
69
+ test('published esm converter entry does not depend on legacy converter paths', async () => {
57
70
  const esmCorePath = path.join(projectRoot, 'lib/esm/scripts/grafana-covert-to-guance-core.js')
58
71
  const esmCoreSource = fs.readFileSync(esmCorePath, 'utf-8')
59
72
  const esmConverterCorePath = path.join(projectRoot, 'lib/esm/scripts/convert-grafana-dashboard-core.js')
60
73
  const esmConverterCoreSource = fs.readFileSync(esmConverterCorePath, 'utf-8')
61
74
 
62
75
  assert.match(esmCoreSource, /convert-grafana-dashboard-core\.js/)
63
- assert.doesNotMatch(esmCoreSource, /skills\/grafana-to-guance-dashboard/)
64
76
  assert.doesNotMatch(esmConverterCoreSource, /from 'fs'|from "fs"|from 'path'|from "path"|from 'url'|from "url"|from 'ajv'|from "ajv"/)
65
77
  assert.doesNotMatch(esmConverterCoreSource, /\?\.|\?\?/)
66
78
 
@@ -72,7 +84,7 @@ test('published esm converter entry does not depend on skills path', async () =>
72
84
  assert.deepEqual(actual, expected)
73
85
  })
74
86
 
75
- test('published cjs converter entry can be required and matches skill converter', () => {
87
+ test('published cjs converter entry can be required and matches converter output', () => {
76
88
  const tempDirectory = fs.mkdtempSync(path.join(projectRoot, '.tmp-guance-front-tools-cjs-'))
77
89
  const tempPackagePath = path.join(tempDirectory, 'package.json')
78
90
  const tempConverterPath = path.join(tempDirectory, 'convert-grafana-dashboard.js')
@@ -95,27 +107,28 @@ test('published cjs converter entry can be required and matches skill converter'
95
107
  assert.deepEqual(actual, expected)
96
108
  })
97
109
 
98
- test('skill converter script is standalone and does not rely on lib sync paths', () => {
99
- const skillWrapperPath = path.join(
110
+ test('converter script exports the local cli helpers and shared converter', () => {
111
+ const converterWrapperPath = path.join(
100
112
  projectRoot,
101
- 'skills/grafana-to-guance-dashboard/scripts/convert-grafana-dashboard.mjs'
113
+ 'lib/scripts/convert-grafana-dashboard.js'
102
114
  )
103
- const skillCorePath = path.join(
115
+ const converterCorePath = path.join(
104
116
  projectRoot,
105
- 'skills/grafana-to-guance-dashboard/scripts/convert-grafana-dashboard-core.js'
117
+ 'lib/scripts/convert-grafana-dashboard-core.js'
106
118
  )
107
- const skillWrapperSource = fs.readFileSync(skillWrapperPath, 'utf-8')
108
- const skillCoreSource = fs.readFileSync(skillCorePath, 'utf-8')
109
-
110
- assert.doesNotMatch(skillWrapperSource, /lib\/scripts\/convert-grafana-dashboard/)
111
- assert.doesNotMatch(skillWrapperSource, /findProjectRoot|process\.cwd\(\)/)
112
- assert.match(skillWrapperSource, /import \{ convertDashboard \} from '\.\/convert-grafana-dashboard-core\.js'/)
113
- assert.match(skillWrapperSource, /^#!\/usr\/bin\/env node/m)
114
- assert.match(skillWrapperSource, /export function main\(/)
115
- assert.match(skillWrapperSource, /export function validateDashboardFile\(/)
116
- assert.match(skillCoreSource, /export function convertDashboard\(/)
117
- assert.doesNotMatch(skillWrapperSource, /\?\.|\?\?/)
118
- assert.doesNotMatch(skillCoreSource, /\?\.|\?\?/)
119
+ const converterWrapperSource = fs.readFileSync(converterWrapperPath, 'utf-8')
120
+ const converterCoreSource = fs.readFileSync(converterCorePath, 'utf-8')
121
+
122
+ assert.match(converterWrapperSource, /^#!\/usr\/bin\/env node/m)
123
+ assert.match(converterWrapperSource, /import Ajv from 'ajv'/)
124
+ assert.match(converterWrapperSource, /import \{ convertDashboard \} from '\.\/convert-grafana-dashboard-core\.js'/)
125
+ assert.match(converterWrapperSource, /export function main\(/)
126
+ assert.match(converterWrapperSource, /export function validateDashboardFile\(/)
127
+ assert.match(converterCoreSource, /export function convertDashboard\(/)
128
+ assert.equal(typeof convertCliMain, 'function')
129
+ assert.equal(typeof validateDashboardFile, 'function')
130
+ assert.doesNotMatch(converterWrapperSource, /\?\.|\?\?/)
131
+ assert.doesNotMatch(converterCoreSource, /\?\.|\?\?/)
119
132
  })
120
133
 
121
134
  test('shared converter infers units from query text when panel unit is missing', () => {
@@ -128,7 +141,7 @@ test('shared converter infers units from query text when panel unit is missing',
128
141
 
129
142
  assert.ok(loadChart)
130
143
  assert.equal(loadChart.extend.settings.unitType, 'global')
131
- assert.deepEqual(loadChart.extend.settings.globalUnit, ['custom', 'short'])
144
+ assert.deepEqual(loadChart.extend.settings.globalUnit, ['number', 'short_scale'])
132
145
  })
133
146
 
134
147
  test('shared converter maps offset queries to guance compare settings', () => {
@@ -161,6 +174,24 @@ test('shared converter maps legend and table sort semantics into guance settings
161
174
  assert.equal(releaseTableChart.extend.settings.mainMeasurementSort, 'top')
162
175
  })
163
176
 
177
+ test('shared converter converts node exporter dashboard fixtures', () => {
178
+ const grafanaDashboard = JSON.parse(fs.readFileSync(grafanaNodeExporterInputPath, 'utf-8'))
179
+ const actual = convertDashboard(grafanaDashboard)
180
+
181
+ assert.equal(actual.title, 'Node Exporter Full')
182
+ assert.equal(actual.main.vars.length, 2)
183
+ assert.equal(actual.main.charts.length, 124)
184
+ assert.equal(actual.main.groups.length, 16)
185
+
186
+ assert.ok(actual.main.groups.some((group) => group.name === 'Quick CPU / Mem / Disk'))
187
+ assert.ok(actual.main.groups.some((group) => group.name === 'Network Traffic'))
188
+
189
+ assert.ok(actual.main.charts.some((chart) => chart.name === 'Pressure'))
190
+ assert.ok(actual.main.charts.some((chart) => chart.name === 'CPU Busy'))
191
+ assert.ok(actual.main.charts.some((chart) => chart.name === 'Network Traffic'))
192
+ assert.ok(actual.main.charts.some((chart) => chart.name === 'Uptime'))
193
+ })
194
+
164
195
  test('shared converter maps repeat panels and infers bytes and seconds units', () => {
165
196
  const actual = convertDashboard({
166
197
  title: 'synthetic',
@@ -191,7 +222,6 @@ test('shared converter maps repeat panels and infers bytes and seconds units', (
191
222
  })
192
223
 
193
224
  assert.deepEqual(actual.main.charts[0].extend.settings.globalUnit, ['digital', 'B'])
194
- assert.equal(actual.main.charts[0].extend.settings.repeatChartVariable, 'host')
195
225
  assert.equal(actual.main.charts[0].extend.settings.repeatChartRowLimit, 4)
196
226
  assert.equal(actual.main.charts[0].extend.settings.extend.layout.repeatDirection, 'h')
197
227
  assert.deepEqual(actual.main.charts[1].extend.settings.globalUnit, ['time', 's'])
@@ -423,13 +453,11 @@ test('cli supports shared converter flags and matches API output', () => {
423
453
  grafanaInputPath,
424
454
  '-o',
425
455
  outPath,
426
- '--validate',
427
456
  '--guance-promql-compatible',
428
457
  '--keep-grafana-meta',
429
458
  ])
430
459
 
431
460
  assert.equal(result.status, 0, result.stderr || result.stdout)
432
- assert.match(result.stdout, /Validated /)
433
461
  assert.equal(fs.existsSync(outPath), true)
434
462
 
435
463
  const actual = JSON.parse(fs.readFileSync(outPath, 'utf-8'))
@@ -451,69 +479,63 @@ test('cli writes default output file to current working directory', () => {
451
479
  assert.deepEqual(actual, expected)
452
480
  })
453
481
 
454
- test('skill cli converts and validates a grafana dashboard with explicit output path', () => {
482
+ test('converter cli converts a grafana dashboard with explicit output path', () => {
455
483
  const tempDir = createTempDir()
456
- const outPath = path.join(tempDir, 'skill', 'guance-dashboard.json')
484
+ const outPath = path.join(tempDir, 'converter', 'guance-dashboard.json')
457
485
  const expected = convertDashboard(JSON.parse(fs.readFileSync(grafanaInputPath, 'utf-8')))
458
486
 
459
- const result = runSkillCli([
487
+ const result = runConverterCli([
460
488
  '--input',
461
489
  grafanaInputPath,
462
490
  '--output',
463
491
  outPath,
464
- '--validate',
465
492
  ])
466
493
 
467
494
  assert.equal(result.status, 0, result.stderr || result.stdout)
468
- assert.match(result.stdout, /Validated /)
469
495
  assert.equal(fs.existsSync(outPath), true)
470
496
 
471
497
  const actual = JSON.parse(fs.readFileSync(outPath, 'utf-8'))
472
498
  assert.deepEqual(actual, expected)
473
499
  })
474
500
 
475
- test('skill cli supports guance promql compatible output', () => {
501
+ test('converter cli supports guance promql compatible output', () => {
476
502
  const tempDir = createTempDir()
477
- const outPath = path.join(tempDir, 'skill', 'guance-promql.json')
503
+ const outPath = path.join(tempDir, 'converter', 'guance-promql.json')
478
504
  const expected = convertDashboard(JSON.parse(fs.readFileSync(grafanaInputPath, 'utf-8')), {
479
505
  guancePromqlCompatible: true,
480
506
  })
481
507
 
482
- const result = runSkillCli([
508
+ const result = runConverterCli([
483
509
  '--input',
484
510
  grafanaInputPath,
485
511
  '--output',
486
512
  outPath,
487
- '--validate',
488
513
  '--guance-promql-compatible',
489
514
  ])
490
515
 
491
516
  assert.equal(result.status, 0, result.stderr || result.stdout)
492
- assert.match(result.stdout, /Validated /)
493
517
  assert.equal(fs.existsSync(outPath), true)
494
518
 
495
519
  const actual = JSON.parse(fs.readFileSync(outPath, 'utf-8'))
496
520
  assert.deepEqual(actual, expected)
497
521
  })
498
522
 
499
- test('skill cli supports keep grafana meta output', () => {
523
+ test('converter cli supports keep grafana meta output', () => {
500
524
  const tempDir = createTempDir()
501
- const outPath = path.join(tempDir, 'skill', 'guance-keep-meta.json')
525
+ const outPath = path.join(tempDir, 'converter', 'guance-keep-meta.json')
502
526
  const expected = convertDashboard(JSON.parse(fs.readFileSync(grafanaInputPath, 'utf-8')), {
503
527
  keepGrafanaMeta: true,
504
528
  })
505
529
 
506
- const result = runSkillCli([
530
+ const result = runConverterCli([
507
531
  '--input',
508
532
  grafanaInputPath,
509
533
  '--output',
510
534
  outPath,
511
- '--validate',
512
535
  '--keep-grafana-meta',
513
536
  ])
514
537
 
515
538
  assert.equal(result.status, 0, result.stderr || result.stdout)
516
- assert.match(result.stdout, /Validated /)
517
539
  assert.equal(fs.existsSync(outPath), true)
518
540
 
519
541
  const actual = JSON.parse(fs.readFileSync(outPath, 'utf-8'))