@atlassian/chippy 0.0.0-stage → 0.0.1-beta.2

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 (133) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +276 -2
  3. package/bin/chippy.mjs +92 -0
  4. package/bin/pack.mjs +204 -0
  5. package/bin/skill-dir.mjs +15 -0
  6. package/lib/avalanche.js +2601 -0
  7. package/lib/avalanche.js.map +7 -0
  8. package/lib/bootstrap.d.ts +1 -0
  9. package/lib/bootstrap.js +70 -0
  10. package/lib/bootstrap.js.map +7 -0
  11. package/lib/browser.js +15 -0
  12. package/lib/browser.js.map +7 -0
  13. package/lib/extension/avalanche.es.js +5535 -0
  14. package/lib/extension/avalanche.es.js.map +1 -0
  15. package/lib/extension/chippy-page-bridge.js +1953 -0
  16. package/lib/extension/inspect-react.js +216 -0
  17. package/lib/extension/layout-lab.js +1453 -0
  18. package/lib/extension/panel-dom.js +90 -0
  19. package/lib/extension/resolve-probes.js +342 -0
  20. package/lib/mcp-skill/LICENSE +201 -0
  21. package/lib/mcp-skill/README.md +148 -0
  22. package/lib/mcp-skill/SKILL.md +335 -0
  23. package/lib/mcp-skill/browser-scripts/playwright-probes.js +368 -0
  24. package/lib/mcp-skill/browser-scripts/playwright-session.js +114 -0
  25. package/lib/mcp-skill/extension/armed-reload-startup.js +83 -0
  26. package/lib/mcp-skill/extension/avalanche.es.js +5535 -0
  27. package/lib/mcp-skill/extension/avalanche.es.js.map +1 -0
  28. package/lib/mcp-skill/extension/avalanche.iife.js +5536 -0
  29. package/lib/mcp-skill/extension/avalanche.iife.js.map +1 -0
  30. package/lib/mcp-skill/extension/background.js +325 -0
  31. package/lib/mcp-skill/extension/chippy-page-bridge.js +1953 -0
  32. package/lib/mcp-skill/extension/content-script.js +190 -0
  33. package/lib/mcp-skill/extension/devtools-hook-shim.js +85 -0
  34. package/lib/mcp-skill/extension/early-bootstrap.js +49 -0
  35. package/lib/mcp-skill/extension/icon-128.png +0 -0
  36. package/lib/mcp-skill/extension/icon-16.png +0 -0
  37. package/lib/mcp-skill/extension/icon-32.png +0 -0
  38. package/lib/mcp-skill/extension/icon-48.png +0 -0
  39. package/lib/mcp-skill/extension/inspect-react.js +216 -0
  40. package/lib/mcp-skill/extension/layout-lab.js +1453 -0
  41. package/lib/mcp-skill/extension/logo.svg +14 -0
  42. package/lib/mcp-skill/extension/manifest.json +69 -0
  43. package/lib/mcp-skill/extension/panel-dom.js +90 -0
  44. package/lib/mcp-skill/extension/panel-settings.js +173 -0
  45. package/lib/mcp-skill/extension/popup.html +41 -0
  46. package/lib/mcp-skill/extension/popup.js +80 -0
  47. package/lib/mcp-skill/extension/probe-descriptor.js +241 -0
  48. package/lib/mcp-skill/extension/resolve-probes.js +342 -0
  49. package/lib/mcp-skill/extension/startup-handoff.js +30 -0
  50. package/lib/mcp-skill/package.json +1 -0
  51. package/lib/mcp-skill/references/README.md +56 -0
  52. package/lib/mcp-skill/references/active-stimulus.md +85 -0
  53. package/lib/mcp-skill/references/avalanche-detector.md +731 -0
  54. package/lib/mcp-skill/references/bdd-router.md +310 -0
  55. package/lib/mcp-skill/references/browser-runtime-api.md +193 -0
  56. package/lib/mcp-skill/references/command-output-formats.md +1085 -0
  57. package/lib/mcp-skill/references/command-surface.md +183 -0
  58. package/lib/mcp-skill/references/cynefin.md +99 -0
  59. package/lib/mcp-skill/references/debug-hook.md +161 -0
  60. package/lib/mcp-skill/references/fixing-performance.md +490 -0
  61. package/lib/mcp-skill/references/hook-metrics.md +199 -0
  62. package/lib/mcp-skill/references/hooks-inspection.md +61 -0
  63. package/lib/mcp-skill/references/jira-taxonomy.md +81 -0
  64. package/lib/mcp-skill/references/mcp.md +122 -0
  65. package/lib/mcp-skill/references/mode-a-injection.md +102 -0
  66. package/lib/mcp-skill/references/operating-model.md +128 -0
  67. package/lib/mcp-skill/references/playwright-cli-setup.md +105 -0
  68. package/lib/mcp-skill/references/playwright-probes.md +205 -0
  69. package/lib/mcp-skill/references/procedures.md +545 -0
  70. package/lib/mcp-skill/references/recipes.txt +114 -0
  71. package/lib/mcp-skill/references/stability-render.md +428 -0
  72. package/lib/mcp-skill/references/test-mode-playbook.md +194 -0
  73. package/lib/mcp-skill/references/troubleshooting.md +59 -0
  74. package/lib/mcp-skill/scripts/avalanche-analyze.cjs +495 -0
  75. package/lib/mcp-skill/scripts/build-avalanche-command.js +34 -0
  76. package/lib/mcp-skill/scripts/build-fiber-state-command.js +19 -0
  77. package/lib/mcp-skill/scripts/chippy-helper-server.js +1768 -0
  78. package/lib/mcp-skill/scripts/chippy-mcp.cjs +273 -0
  79. package/lib/mcp-skill/scripts/chippy.sh +1252 -0
  80. package/lib/mcp-skill/scripts/format-probe-result.js +34 -0
  81. package/lib/mcp-skill/scripts/helper-access.js +158 -0
  82. package/lib/mcp-skill/scripts/helper-proxy.js +87 -0
  83. package/lib/mcp-skill/scripts/page-socket-trust.js +81 -0
  84. package/lib/mcp-skill/scripts/probe-annotation-channel.js +116 -0
  85. package/lib/mcp-skill/scripts/search-recipes.js +248 -0
  86. package/lib/mcp-skill/snippets/README.md +89 -0
  87. package/lib/mcp-skill/snippets/count-context-consumers.js +40 -0
  88. package/lib/mcp-skill/snippets/find-context-providers.js +38 -0
  89. package/lib/mcp-skill/snippets/find-legacy-context.js +47 -0
  90. package/lib/mcp-skill/snippets/find-prop.js +83 -0
  91. package/lib/mcp-skill/snippets/hook-metrics-sample.js +69 -0
  92. package/lib/mcp-skill/snippets/hook-metrics.js +60 -0
  93. package/lib/mcp-skill/snippets/hook-tracker.js +198 -0
  94. package/lib/mcp-skill/snippets/stability-nudge.js +101 -0
  95. package/lib/package.json +1 -0
  96. package/lib/plugin.js +119 -0
  97. package/lib/plugin.js.map +7 -0
  98. package/lib/storybook/avalanche-panel-model.js +79 -0
  99. package/lib/storybook/brand.jsx +6 -0
  100. package/lib/storybook/connection-fallback.jsx +47 -0
  101. package/lib/storybook/constants.js +15 -0
  102. package/lib/storybook/context-card.jsx +171 -0
  103. package/lib/storybook/manager-owner.js +42 -0
  104. package/lib/storybook/manager.jsx +425 -0
  105. package/lib/storybook/preset.js +7 -0
  106. package/lib/storybook/preview.js +298 -0
  107. package/lib/storybook/probe-annotation-editor.jsx +52 -0
  108. package/lib/storybook/probe-intent.js +23 -0
  109. package/lib/storybook/setup.js +104 -0
  110. package/lib/types/avalanche/commit-metrics-adapter.d.ts +76 -0
  111. package/lib/types/avalanche/commit-stats-indices.d.ts +41 -0
  112. package/lib/types/avalanche/commit-surface-ownership.d.ts +9 -0
  113. package/lib/types/avalanche/detector.d.ts +183 -0
  114. package/lib/types/avalanche/interaction-capture.d.ts +25 -0
  115. package/lib/types/avalanche/internals.d.ts +189 -0
  116. package/lib/types/avalanche/report-serializer.d.ts +283 -0
  117. package/lib/types/avalanche/reporter.d.ts +610 -0
  118. package/lib/types/chippy-bridge/fiber-source.d.ts +48 -0
  119. package/lib/types/chippy-bridge/react-renderer.d.ts +74 -0
  120. package/lib/types/chippy-bridge/recorded-source.d.ts +44 -0
  121. package/lib/types/chippy-bridge/source-map.d.ts +30 -0
  122. package/lib/types/debug-render/core.d.ts +78 -0
  123. package/lib/types/layout-lab/fiber-boundaries.d.ts +51 -0
  124. package/lib/types/layout-lab/fiber-walk.d.ts +131 -0
  125. package/lib/types/layout-lab/marker-context.d.ts +94 -0
  126. package/lib/types/package/avalanche.d.ts +6 -0
  127. package/lib/types/package/browser.d.ts +10 -0
  128. package/lib/types/package/plugin.d.ts +15 -0
  129. package/lib/types/plugins/atl/commit-metrics-adapter.d.ts +65 -0
  130. package/lib/types/plugins/atl/metrics-slot.d.ts +37 -0
  131. package/lib/types/plugins/index.d.ts +49 -0
  132. package/lib/types/plugins/jira/context-provider.d.ts +36 -0
  133. package/package.json +106 -4
@@ -0,0 +1,216 @@
1
+ /* eslint-disable */
2
+ (function installInspectReact(global) {
3
+ const chippy = global.__CHIPPY = global.__CHIPPY || {};
4
+ // Always reinstall — guards caused stale code to win after extension reload.
5
+
6
+ function getReactInternalKeys(node) {
7
+ if (!node) {
8
+ return [];
9
+ }
10
+
11
+ return Object.getOwnPropertyNames(node).filter(
12
+ (key) =>
13
+ key.startsWith('__reactFiber$') ||
14
+ key.startsWith('__reactProps$') ||
15
+ key.startsWith('__reactContainer$'),
16
+ );
17
+ }
18
+
19
+ function getFiberFromNode(node) {
20
+ if (!node) {
21
+ return null;
22
+ }
23
+
24
+ const fiberKey = getReactInternalKeys(node).find((key) => key.startsWith('__reactFiber$'));
25
+ const containerKey = getReactInternalKeys(node).find((key) => key.startsWith('__reactContainer$'));
26
+
27
+ return node[fiberKey] || node[containerKey] || null;
28
+ }
29
+
30
+ function getClosestFiber(node) {
31
+ let current = node;
32
+
33
+ while (current) {
34
+ const fiber = getFiberFromNode(current);
35
+ if (fiber) {
36
+ return fiber;
37
+ }
38
+ current = current.parentNode || current.host || null;
39
+ }
40
+
41
+ return null;
42
+ }
43
+
44
+ function getDisplayName(type) {
45
+ if (!type) {
46
+ return null;
47
+ }
48
+ if (typeof type === 'string') {
49
+ return type;
50
+ }
51
+ return type.displayName || type.name || type.render?.displayName || type.render?.name || 'Anonymous';
52
+ }
53
+
54
+ function normalizeSource(source) {
55
+ if (!source) {
56
+ return null;
57
+ }
58
+
59
+ return {
60
+ fileName: source.fileName || null,
61
+ lineNumber: source.lineNumber || null,
62
+ columnNumber: source.columnNumber || null,
63
+ };
64
+ }
65
+
66
+ function sourceOf(fiber) {
67
+ const describeFiberSource = global.__AVALANCHE__?.layoutLab?.describeFiberSource;
68
+ return typeof describeFiberSource === 'function'
69
+ ? describeFiberSource(fiber)
70
+ : normalizeSource(fiber?._debugSource || fiber?.type?._debugSource || null);
71
+ }
72
+
73
+ function describeFiber(fiber) {
74
+ if (!fiber) {
75
+ return null;
76
+ }
77
+
78
+ return {
79
+ key: fiber.key ?? null,
80
+ tag: fiber.tag ?? null,
81
+ index: fiber.index ?? null,
82
+ elementType: getDisplayName(fiber.elementType),
83
+ type: getDisplayName(fiber.type),
84
+ stateNodeType:
85
+ fiber.stateNode && fiber.stateNode.nodeType === 1
86
+ ? fiber.stateNode.tagName.toLowerCase()
87
+ : typeof fiber.stateNode,
88
+ debugSource: sourceOf(fiber),
89
+ memoizedPropsKeys: fiber.memoizedProps ? Object.keys(fiber.memoizedProps) : [],
90
+ };
91
+ }
92
+
93
+ function isCompositeFiber(fiber) {
94
+ if (!fiber) {
95
+ return false;
96
+ }
97
+
98
+ const name = getDisplayName(fiber.type);
99
+ return Boolean(name && typeof fiber.type !== 'string');
100
+ }
101
+
102
+ function getOwnerChain(fiber) {
103
+ const owners = [];
104
+ let current = fiber ? fiber._debugOwner : null;
105
+
106
+ while (current) {
107
+ owners.push(describeFiber(current));
108
+ current = current._debugOwner || null;
109
+ }
110
+
111
+ return owners;
112
+ }
113
+
114
+ function getReturnChain(fiber) {
115
+ const parents = [];
116
+ let current = fiber ? fiber.return : null;
117
+
118
+ while (current) {
119
+ parents.push(describeFiber(current));
120
+ current = current.return || null;
121
+ }
122
+
123
+ return parents;
124
+ }
125
+
126
+ function getNearestCompositeFiber(fiber) {
127
+ let current = fiber;
128
+
129
+ while (current) {
130
+ if (isCompositeFiber(current)) {
131
+ return current;
132
+ }
133
+ current = current.return || null;
134
+ }
135
+
136
+ return null;
137
+ }
138
+
139
+
140
+ function getNearestTestIdParent(node) {
141
+ // Walk includes the node itself — if the probed element has data-testid, that wins.
142
+ let current = node || null;
143
+ while (current) {
144
+ const testId = current.dataset ? current.dataset.testid : null;
145
+ if (testId) {
146
+ const fiber = getFiberFromNode(current) || getClosestFiber(current);
147
+ const componentFiber = getNearestCompositeFiber(fiber);
148
+ return {
149
+ testId,
150
+ tagName: current.tagName ? current.tagName.toLowerCase() : null,
151
+ component: describeFiber(componentFiber),
152
+ fiber: describeFiber(fiber),
153
+ };
154
+ }
155
+ current = current.parentElement || null;
156
+ }
157
+ return null;
158
+ }
159
+
160
+ function inspectNode(node) {
161
+ const fiber = getFiberFromNode(node) || getClosestFiber(node);
162
+ const componentFiber = getNearestCompositeFiber(fiber);
163
+
164
+ return {
165
+ dom: node
166
+ ? {
167
+ tagName: node.tagName ? node.tagName.toLowerCase() : null,
168
+ text: node.textContent?.trim() || '',
169
+ reactKeys: getReactInternalKeys(node),
170
+ }
171
+ : null,
172
+ fiber: describeFiber(fiber),
173
+ component: describeFiber(componentFiber),
174
+ owners: getOwnerChain(componentFiber || fiber),
175
+ returns: getReturnChain(componentFiber || fiber),
176
+ nearestTestIdParent: getNearestTestIdParent(node),
177
+ };
178
+ }
179
+
180
+ function findByText(text, root = document) {
181
+ return Array.from(root.querySelectorAll('*'))
182
+ .filter((node) => node.textContent?.trim() === text)
183
+ .map((node) => ({
184
+ node,
185
+ inspection: inspectNode(node),
186
+ }));
187
+ }
188
+
189
+ function findBySelector(selector, root = document) {
190
+ return Array.from(root.querySelectorAll(selector)).map((node) => ({
191
+ node,
192
+ inspection: inspectNode(node),
193
+ }));
194
+ }
195
+
196
+ function inspectAtPoint(x, y) {
197
+ return document.elementsFromPoint(x, y).map((node) => ({
198
+ node,
199
+ inspection: inspectNode(node),
200
+ }));
201
+ }
202
+
203
+ chippy.inspectReact = {
204
+ getReactInternalKeys,
205
+ getFiberFromNode,
206
+ getClosestFiber,
207
+ getNearestCompositeFiber,
208
+ describeFiber,
209
+ getOwnerChain,
210
+ getReturnChain,
211
+ inspectNode,
212
+ inspectAtPoint,
213
+ findByText,
214
+ findBySelector,
215
+ };
216
+ })(window);