@productivemark/snipcss 1.0.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 (117) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/.claude-plugin/plugin.json +10 -0
  3. package/.mcp.json +8 -0
  4. package/dist/auth/config-manager.d.ts +13 -0
  5. package/dist/auth/config-manager.d.ts.map +1 -0
  6. package/dist/auth/config-manager.js +48 -0
  7. package/dist/auth/config-manager.js.map +1 -0
  8. package/dist/auth/usage-gate.d.ts +13 -0
  9. package/dist/auth/usage-gate.d.ts.map +1 -0
  10. package/dist/auth/usage-gate.js +69 -0
  11. package/dist/auth/usage-gate.js.map +1 -0
  12. package/dist/browser/browser-manager.d.ts +15 -0
  13. package/dist/browser/browser-manager.d.ts.map +1 -0
  14. package/dist/browser/browser-manager.js +61 -0
  15. package/dist/browser/browser-manager.js.map +1 -0
  16. package/dist/browser/viewport-manager.d.ts +8 -0
  17. package/dist/browser/viewport-manager.d.ts.map +1 -0
  18. package/dist/browser/viewport-manager.js +50 -0
  19. package/dist/browser/viewport-manager.js.map +1 -0
  20. package/dist/extraction/css-variable-resolver.d.ts +27 -0
  21. package/dist/extraction/css-variable-resolver.d.ts.map +1 -0
  22. package/dist/extraction/css-variable-resolver.js +105 -0
  23. package/dist/extraction/css-variable-resolver.js.map +1 -0
  24. package/dist/extraction/dom-labeler.d.ts +26 -0
  25. package/dist/extraction/dom-labeler.d.ts.map +1 -0
  26. package/dist/extraction/dom-labeler.js +124 -0
  27. package/dist/extraction/dom-labeler.js.map +1 -0
  28. package/dist/extraction/element-discovery.d.ts +59 -0
  29. package/dist/extraction/element-discovery.d.ts.map +1 -0
  30. package/dist/extraction/element-discovery.js +525 -0
  31. package/dist/extraction/element-discovery.js.map +1 -0
  32. package/dist/extraction/extraction-pipeline.d.ts +26 -0
  33. package/dist/extraction/extraction-pipeline.d.ts.map +1 -0
  34. package/dist/extraction/extraction-pipeline.js +200 -0
  35. package/dist/extraction/extraction-pipeline.js.map +1 -0
  36. package/dist/extraction/font-collector.d.ts +26 -0
  37. package/dist/extraction/font-collector.d.ts.map +1 -0
  38. package/dist/extraction/font-collector.js +160 -0
  39. package/dist/extraction/font-collector.js.map +1 -0
  40. package/dist/extraction/html-cleaner.d.ts +16 -0
  41. package/dist/extraction/html-cleaner.d.ts.map +1 -0
  42. package/dist/extraction/html-cleaner.js +149 -0
  43. package/dist/extraction/html-cleaner.js.map +1 -0
  44. package/dist/extraction/keyframe-collector.d.ts +16 -0
  45. package/dist/extraction/keyframe-collector.d.ts.map +1 -0
  46. package/dist/extraction/keyframe-collector.js +62 -0
  47. package/dist/extraction/keyframe-collector.js.map +1 -0
  48. package/dist/extraction/pseudo-state-handler.d.ts +36 -0
  49. package/dist/extraction/pseudo-state-handler.d.ts.map +1 -0
  50. package/dist/extraction/pseudo-state-handler.js +210 -0
  51. package/dist/extraction/pseudo-state-handler.js.map +1 -0
  52. package/dist/extraction/result-builder.d.ts +25 -0
  53. package/dist/extraction/result-builder.d.ts.map +1 -0
  54. package/dist/extraction/result-builder.js +136 -0
  55. package/dist/extraction/result-builder.js.map +1 -0
  56. package/dist/extraction/rule-deduplicator.d.ts +39 -0
  57. package/dist/extraction/rule-deduplicator.d.ts.map +1 -0
  58. package/dist/extraction/rule-deduplicator.js +107 -0
  59. package/dist/extraction/rule-deduplicator.js.map +1 -0
  60. package/dist/extraction/selector-fixer.d.ts +25 -0
  61. package/dist/extraction/selector-fixer.d.ts.map +1 -0
  62. package/dist/extraction/selector-fixer.js +111 -0
  63. package/dist/extraction/selector-fixer.js.map +1 -0
  64. package/dist/extraction/specificity.d.ts +17 -0
  65. package/dist/extraction/specificity.d.ts.map +1 -0
  66. package/dist/extraction/specificity.js +88 -0
  67. package/dist/extraction/specificity.js.map +1 -0
  68. package/dist/extraction/style-matcher.d.ts +33 -0
  69. package/dist/extraction/style-matcher.d.ts.map +1 -0
  70. package/dist/extraction/style-matcher.js +199 -0
  71. package/dist/extraction/style-matcher.js.map +1 -0
  72. package/dist/extraction/stylesheet-collector.d.ts +33 -0
  73. package/dist/extraction/stylesheet-collector.d.ts.map +1 -0
  74. package/dist/extraction/stylesheet-collector.js +71 -0
  75. package/dist/extraction/stylesheet-collector.js.map +1 -0
  76. package/dist/index.d.ts +3 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +235 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/mcp-server.d.ts +3 -0
  81. package/dist/mcp-server.d.ts.map +1 -0
  82. package/dist/mcp-server.js +349 -0
  83. package/dist/mcp-server.js.map +1 -0
  84. package/dist/tailwind/css-to-tailwind.d.ts +17 -0
  85. package/dist/tailwind/css-to-tailwind.d.ts.map +1 -0
  86. package/dist/tailwind/css-to-tailwind.js +1583 -0
  87. package/dist/tailwind/css-to-tailwind.js.map +1 -0
  88. package/dist/tailwind/shorthand-expander.d.ts +27 -0
  89. package/dist/tailwind/shorthand-expander.d.ts.map +1 -0
  90. package/dist/tailwind/shorthand-expander.js +812 -0
  91. package/dist/tailwind/shorthand-expander.js.map +1 -0
  92. package/dist/tailwind/tailwind-converter.d.ts +35 -0
  93. package/dist/tailwind/tailwind-converter.d.ts.map +1 -0
  94. package/dist/tailwind/tailwind-converter.js +1223 -0
  95. package/dist/tailwind/tailwind-converter.js.map +1 -0
  96. package/dist/tailwind/tailwind-helpers.d.ts +95 -0
  97. package/dist/tailwind/tailwind-helpers.d.ts.map +1 -0
  98. package/dist/tailwind/tailwind-helpers.js +593 -0
  99. package/dist/tailwind/tailwind-helpers.js.map +1 -0
  100. package/dist/tailwind/tailwind-reducer.d.ts +36 -0
  101. package/dist/tailwind/tailwind-reducer.d.ts.map +1 -0
  102. package/dist/tailwind/tailwind-reducer.js +189 -0
  103. package/dist/tailwind/tailwind-reducer.js.map +1 -0
  104. package/dist/types/index.d.ts +239 -0
  105. package/dist/types/index.d.ts.map +1 -0
  106. package/dist/types/index.js +94 -0
  107. package/dist/types/index.js.map +1 -0
  108. package/dist/utils/helpers.d.ts +34 -0
  109. package/dist/utils/helpers.d.ts.map +1 -0
  110. package/dist/utils/helpers.js +120 -0
  111. package/dist/utils/helpers.js.map +1 -0
  112. package/dist/utils/parsel.d.ts +41 -0
  113. package/dist/utils/parsel.d.ts.map +1 -0
  114. package/dist/utils/parsel.js +314 -0
  115. package/dist/utils/parsel.js.map +1 -0
  116. package/package.json +41 -0
  117. package/skills/workflow/SKILL.md +95 -0
@@ -0,0 +1,124 @@
1
+ import { randomLetters } from '../utils/helpers.js';
2
+ /**
3
+ * Labels DOM elements with unique snipcss marker classes.
4
+ * Replaces the content script's snipcssLabelSubelements function.
5
+ * Runs entirely via page.evaluate() - no content script needed.
6
+ */
7
+ export class DomLabeler {
8
+ /**
9
+ * Label the target element and all its descendants with unique snipcss classes.
10
+ * Returns the list of classnames and the HTML.
11
+ *
12
+ * Port of snipcssLabelSubelements from sniptools.js
13
+ */
14
+ async labelElements(page, selector) {
15
+ const snipId = randomLetters(4);
16
+ const result = await page.evaluate(({ selector, snipId }) => {
17
+ const root = document.querySelector(selector);
18
+ if (!root) {
19
+ return {
20
+ error: `Element not found: ${selector}`,
21
+ allClassnamesArr: [],
22
+ allElementOuterHtml: '',
23
+ allLabelOuterHtml: '',
24
+ rootSelector: selector,
25
+ rootClassname: '',
26
+ };
27
+ }
28
+ const allClassnamesArr = [];
29
+ let idCounter = 0;
30
+ function labelElement(elem, parentId, level) {
31
+ if (elem.nodeType !== 1)
32
+ return; // Element nodes only
33
+ const tagName = elem.tagName.toLowerCase();
34
+ // Skip script/style/noscript
35
+ if (['script', 'style', 'noscript', 'link', 'meta'].includes(tagName))
36
+ return;
37
+ const currId = idCounter++;
38
+ const className = `snipcss${snipId}-${level}-${parentId}-${currId}`;
39
+ elem.classList.add(className);
40
+ allClassnamesArr.push(className);
41
+ // Label children recursively
42
+ const children = elem.children;
43
+ for (let i = 0; i < children.length; i++) {
44
+ labelElement(children[i], currId, level + 1);
45
+ }
46
+ }
47
+ // Label root and all descendants
48
+ labelElement(root, 0, 0);
49
+ const rootClassname = allClassnamesArr[0] || '';
50
+ // Capture HTML after labeling
51
+ const allElementOuterHtml = root.outerHTML;
52
+ // Also capture a version with just the labels for Tailwind
53
+ const allLabelOuterHtml = root.outerHTML;
54
+ return {
55
+ allClassnamesArr,
56
+ allElementOuterHtml,
57
+ allLabelOuterHtml,
58
+ rootSelector: selector,
59
+ rootClassname,
60
+ };
61
+ }, { selector, snipId });
62
+ if ('error' in result && result.error) {
63
+ throw new Error(result.error);
64
+ }
65
+ return result;
66
+ }
67
+ /**
68
+ * Remove all snipcss marker classes from the page DOM.
69
+ * Called after extraction is complete.
70
+ */
71
+ async removeLabels(page) {
72
+ await page.evaluate(() => {
73
+ const elements = document.querySelectorAll('[class*="snipcss"]');
74
+ elements.forEach((elem) => {
75
+ const classes = [...elem.classList];
76
+ classes.forEach((cls) => {
77
+ if (cls.startsWith('snipcss')) {
78
+ elem.classList.remove(cls);
79
+ }
80
+ });
81
+ // Clean up empty class attributes
82
+ if (elem.classList.length === 0) {
83
+ elem.removeAttribute('class');
84
+ }
85
+ });
86
+ });
87
+ }
88
+ /**
89
+ * Get the outerHTML of an element after labels have been removed.
90
+ */
91
+ async getCleanHtml(page, selector) {
92
+ return await page.evaluate((sel) => {
93
+ const elem = document.querySelector(sel);
94
+ if (!elem)
95
+ return '';
96
+ // Clone and remove snipcss classes
97
+ const clone = elem.cloneNode(true);
98
+ const labeled = clone.querySelectorAll('[class*="snipcss"]');
99
+ labeled.forEach((el) => {
100
+ const classes = [...el.classList];
101
+ classes.forEach((cls) => {
102
+ if (cls.startsWith('snipcss')) {
103
+ el.classList.remove(cls);
104
+ }
105
+ });
106
+ if (el.classList.length === 0) {
107
+ el.removeAttribute('class');
108
+ }
109
+ });
110
+ // Also clean the root
111
+ const rootClasses = [...clone.classList];
112
+ rootClasses.forEach((cls) => {
113
+ if (cls.startsWith('snipcss')) {
114
+ clone.classList.remove(cls);
115
+ }
116
+ });
117
+ if (clone.classList.length === 0) {
118
+ clone.removeAttribute('class');
119
+ }
120
+ return clone.outerHTML;
121
+ }, selector);
122
+ }
123
+ }
124
+ //# sourceMappingURL=dom-labeler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-labeler.js","sourceRoot":"","sources":["../../src/extraction/dom-labeler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { Page } from 'playwright';
2
+ /**
3
+ * Discovered element with semantic information for agent-driven extraction.
4
+ */
5
+ export interface DiscoveredElement {
6
+ /** Numeric label (1, 2, 3...) for referencing in screenshots */
7
+ label: number;
8
+ /** Unique CSS selector guaranteed to match exactly one element */
9
+ selector: string;
10
+ /** HTML tag name */
11
+ tag: string;
12
+ /** Semantic role inferred from tag, ARIA role, class names, and position */
13
+ semanticType: string;
14
+ /** Parent chain context (e.g., "inside main > .content") */
15
+ parentContext: string;
16
+ /** Bounding box (absolute, accounting for scroll) */
17
+ rect: {
18
+ x: number;
19
+ y: number;
20
+ width: number;
21
+ height: number;
22
+ };
23
+ /** Background color (computed) */
24
+ backgroundColor: string;
25
+ /** Number of child elements */
26
+ childCount: number;
27
+ /** Text content preview (first 80 chars) */
28
+ textPreview: string;
29
+ /** Element's class list */
30
+ classes: string;
31
+ /** Element's id */
32
+ id: string;
33
+ /** Nesting depth from body */
34
+ depth: number;
35
+ }
36
+ /**
37
+ * Discover page segments using the SnipCSS page segmenter approach:
38
+ * 1. Sample visible elements via grid-point probing (elementFromPoint)
39
+ * 2. Scroll the page to catch all content including lazy-loaded
40
+ * 3. Bottom-up merge: consolidate small elements into parent containers
41
+ * 4. Smart filter: split oversized parents, remove redundant wrappers
42
+ * 5. Generate unique selectors and enrich with semantic metadata
43
+ *
44
+ * Ported from snip-extension/js/page_segmenter.js
45
+ */
46
+ export declare function discoverElements(page: Page): Promise<DiscoveredElement[]>;
47
+ /**
48
+ * Inject numbered badge overlay into the page at each element's position.
49
+ */
50
+ export declare function injectLabelOverlay(page: Page, elements: DiscoveredElement[]): Promise<void>;
51
+ /**
52
+ * Remove the label overlay from the page.
53
+ */
54
+ export declare function removeLabelOverlay(page: Page): Promise<void>;
55
+ /**
56
+ * Format discovered elements as a human-readable legend.
57
+ */
58
+ export declare function formatElementLegend(elements: DiscoveredElement[]): string;
59
+ //# sourceMappingURL=element-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-discovery.d.ts","sourceRoot":"","sources":["../../src/extraction/element-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAWD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6W/E;AA2DD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAUzE"}