@hover-dev/core 0.16.0 → 0.17.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 (154) hide show
  1. package/README.md +26 -55
  2. package/dist/agentDirectives.d.ts +55 -0
  3. package/dist/agentDirectives.d.ts.map +1 -0
  4. package/dist/agentDirectives.js +276 -0
  5. package/dist/agents/claude.d.ts.map +1 -1
  6. package/dist/agents/claude.js +28 -3
  7. package/dist/agents/codex.d.ts.map +1 -1
  8. package/dist/agents/codex.js +29 -14
  9. package/dist/agents/invoke.d.ts.map +1 -1
  10. package/dist/agents/invoke.js +3 -6
  11. package/dist/agents/registry.d.ts.map +1 -1
  12. package/dist/agents/registry.js +0 -4
  13. package/dist/agents/types.d.ts +19 -11
  14. package/dist/agents/types.d.ts.map +1 -1
  15. package/dist/engine.d.ts +53 -0
  16. package/dist/engine.d.ts.map +1 -0
  17. package/dist/engine.js +78 -0
  18. package/dist/mcp/actuateServer.d.ts +3 -0
  19. package/dist/mcp/actuateServer.d.ts.map +1 -0
  20. package/dist/mcp/actuateServer.js +594 -0
  21. package/dist/mcp/sourceFence.d.ts.map +1 -1
  22. package/dist/mcp/sourceFence.js +4 -0
  23. package/dist/mcp/sourceServer.js +75 -0
  24. package/dist/memory/businessMemory.d.ts +29 -0
  25. package/dist/memory/businessMemory.d.ts.map +1 -0
  26. package/dist/memory/businessMemory.js +125 -0
  27. package/dist/modes.d.ts +39 -0
  28. package/dist/modes.d.ts.map +1 -0
  29. package/dist/modes.js +34 -0
  30. package/dist/playwright/cdpStatus.d.ts +0 -15
  31. package/dist/playwright/cdpStatus.d.ts.map +1 -1
  32. package/dist/playwright/cdpStatus.js +0 -67
  33. package/dist/playwright/launchChrome.d.ts +18 -0
  34. package/dist/playwright/launchChrome.d.ts.map +1 -1
  35. package/dist/playwright/launchChrome.js +46 -3
  36. package/dist/playwright/resolveMcpConfig.d.ts +7 -1
  37. package/dist/playwright/resolveMcpConfig.d.ts.map +1 -1
  38. package/dist/playwright/resolveMcpConfig.js +22 -4
  39. package/dist/plugin-api.d.ts +28 -26
  40. package/dist/plugin-api.d.ts.map +1 -1
  41. package/dist/plugin-api.js +2 -2
  42. package/dist/qa/candidates.d.ts +32 -0
  43. package/dist/qa/candidates.d.ts.map +1 -0
  44. package/dist/qa/candidates.js +20 -0
  45. package/dist/qa/classify.d.ts +38 -0
  46. package/dist/qa/classify.d.ts.map +1 -0
  47. package/dist/qa/classify.js +138 -0
  48. package/dist/qa/intensity.d.ts +33 -0
  49. package/dist/qa/intensity.d.ts.map +1 -0
  50. package/dist/qa/intensity.js +25 -0
  51. package/dist/qa/qaReport.d.ts +19 -0
  52. package/dist/qa/qaReport.d.ts.map +1 -0
  53. package/dist/qa/qaReport.js +50 -0
  54. package/dist/runSession.d.ts +14 -3
  55. package/dist/runSession.d.ts.map +1 -1
  56. package/dist/runSession.js +26 -11
  57. package/dist/service/cdpHandlers.d.ts +1 -21
  58. package/dist/service/cdpHandlers.d.ts.map +1 -1
  59. package/dist/service/cdpHandlers.js +4 -39
  60. package/dist/service/cdpHint.d.ts +21 -28
  61. package/dist/service/cdpHint.d.ts.map +1 -1
  62. package/dist/service/cdpHint.js +106 -164
  63. package/dist/service/relayHandlers.d.ts +28 -0
  64. package/dist/service/relayHandlers.d.ts.map +1 -0
  65. package/dist/service/relayHandlers.js +105 -0
  66. package/dist/service/saveHandlers.d.ts +1 -3
  67. package/dist/service/saveHandlers.d.ts.map +1 -1
  68. package/dist/service/saveHandlers.js +17 -15
  69. package/dist/service/types.d.ts +108 -8
  70. package/dist/service/types.d.ts.map +1 -1
  71. package/dist/service.d.ts +7 -3
  72. package/dist/service.d.ts.map +1 -1
  73. package/dist/service.js +907 -200
  74. package/dist/sessions/sessions.d.ts +125 -0
  75. package/dist/sessions/sessions.d.ts.map +1 -0
  76. package/dist/sessions/sessions.js +175 -0
  77. package/dist/specs/authFixture.d.ts +30 -0
  78. package/dist/specs/authFixture.d.ts.map +1 -0
  79. package/dist/specs/authFixture.js +145 -0
  80. package/dist/specs/businessMap.d.ts +29 -0
  81. package/dist/specs/businessMap.d.ts.map +1 -0
  82. package/dist/specs/businessMap.js +95 -0
  83. package/dist/specs/detectSharedFlows.d.ts +1 -1
  84. package/dist/specs/detectSharedFlows.d.ts.map +1 -1
  85. package/dist/specs/detectSharedFlows.js +20 -21
  86. package/dist/specs/generatePageObject.d.ts +1 -1
  87. package/dist/specs/generatePageObject.d.ts.map +1 -1
  88. package/dist/specs/healPrompt.d.ts +19 -0
  89. package/dist/specs/healPrompt.d.ts.map +1 -0
  90. package/dist/specs/healPrompt.js +48 -0
  91. package/dist/specs/humanSteps.d.ts +4 -8
  92. package/dist/specs/humanSteps.d.ts.map +1 -1
  93. package/dist/specs/humanSteps.js +6 -1
  94. package/dist/specs/optimizeSpec.d.ts +15 -8
  95. package/dist/specs/optimizeSpec.d.ts.map +1 -1
  96. package/dist/specs/optimizeSpec.js +71 -41
  97. package/dist/specs/optimizeSpecWithAgent.d.ts +0 -2
  98. package/dist/specs/optimizeSpecWithAgent.d.ts.map +1 -1
  99. package/dist/specs/optimizeSpecWithAgent.js +0 -1
  100. package/dist/specs/pageObjectManifest.d.ts +3 -1
  101. package/dist/specs/pageObjectManifest.d.ts.map +1 -1
  102. package/dist/specs/pageObjectManifest.js +13 -9
  103. package/dist/specs/replayGrounded.d.ts +45 -0
  104. package/dist/specs/replayGrounded.d.ts.map +1 -0
  105. package/dist/specs/replayGrounded.js +155 -0
  106. package/dist/specs/runFailures.d.ts +34 -0
  107. package/dist/specs/runFailures.d.ts.map +1 -0
  108. package/dist/specs/runFailures.js +93 -0
  109. package/dist/specs/seeds.d.ts +16 -15
  110. package/dist/specs/seeds.d.ts.map +1 -1
  111. package/dist/specs/seeds.js +86 -54
  112. package/dist/specs/sidecar.d.ts +34 -6
  113. package/dist/specs/sidecar.d.ts.map +1 -1
  114. package/dist/specs/sidecar.js +79 -9
  115. package/dist/specs/specStep.d.ts +21 -0
  116. package/dist/specs/specStep.d.ts.map +1 -0
  117. package/dist/specs/specStep.js +1 -0
  118. package/dist/specs/text.d.ts +8 -6
  119. package/dist/specs/text.d.ts.map +1 -1
  120. package/dist/specs/text.js +10 -7
  121. package/dist/specs/writeSpec.d.ts +62 -1
  122. package/dist/specs/writeSpec.d.ts.map +1 -1
  123. package/dist/specs/writeSpec.js +596 -21
  124. package/package.json +6 -9
  125. package/dist/agents/aider.d.ts +0 -16
  126. package/dist/agents/aider.d.ts.map +0 -1
  127. package/dist/agents/aider.js +0 -161
  128. package/dist/agents/cursor.d.ts +0 -18
  129. package/dist/agents/cursor.d.ts.map +0 -1
  130. package/dist/agents/cursor.js +0 -220
  131. package/dist/playwright/raiseWindow.d.ts +0 -10
  132. package/dist/playwright/raiseWindow.d.ts.map +0 -1
  133. package/dist/playwright/raiseWindow.js +0 -158
  134. package/dist/scripts/bench-multi-tab.d.ts +0 -2
  135. package/dist/scripts/bench-multi-tab.d.ts.map +0 -1
  136. package/dist/scripts/bench-multi-tab.js +0 -192
  137. package/dist/scripts/bench-ttfb.d.ts +0 -2
  138. package/dist/scripts/bench-ttfb.d.ts.map +0 -1
  139. package/dist/scripts/bench-ttfb.js +0 -127
  140. package/dist/scripts/start-chrome.d.ts +0 -3
  141. package/dist/scripts/start-chrome.d.ts.map +0 -1
  142. package/dist/scripts/start-chrome.js +0 -23
  143. package/dist/skills/writeSkill.d.ts +0 -27
  144. package/dist/skills/writeSkill.d.ts.map +0 -1
  145. package/dist/skills/writeSkill.js +0 -13
  146. package/dist/specs/listSpecs.d.ts +0 -52
  147. package/dist/specs/listSpecs.d.ts.map +0 -1
  148. package/dist/specs/listSpecs.js +0 -139
  149. package/dist/specs/optimizationSuggestion.d.ts +0 -26
  150. package/dist/specs/optimizationSuggestion.d.ts.map +0 -1
  151. package/dist/specs/optimizationSuggestion.js +0 -28
  152. package/dist/specs/writeCaseCsv.d.ts +0 -28
  153. package/dist/specs/writeCaseCsv.d.ts.map +0 -1
  154. package/dist/specs/writeCaseCsv.js +0 -134
@@ -1,28 +0,0 @@
1
- import type { SkillStep } from '../skills/writeSkill.js';
2
- import type { SpecAssertion } from './writeSpec.js';
3
- export declare class CaseCsvExistsError extends Error {
4
- readonly slug: string;
5
- readonly path: string;
6
- constructor(slug: string, path: string);
7
- }
8
- export interface WriteCaseCsvOptions {
9
- devRoot: string;
10
- name: string;
11
- description?: string;
12
- steps: SkillStep[];
13
- assertions?: SpecAssertion[];
14
- /** Optional Jira project key prefix (e.g. "PROJ"). Goes into Labels so
15
- * the importer can route the test cases without rewriting the CSV.
16
- * Stripped of whitespace; if empty, no project label is added. */
17
- jiraProjectKey?: string;
18
- /** Free-form labels appended after the default "hover" label. Split
19
- * on commas/whitespace and lowercased. */
20
- labels?: string;
21
- overwrite?: boolean;
22
- }
23
- export interface WriteCaseCsvResult {
24
- path: string;
25
- slug: string;
26
- }
27
- export declare function writeCaseCsv(opts: WriteCaseCsvOptions): Promise<WriteCaseCsvResult>;
28
- //# sourceMappingURL=writeCaseCsv.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"writeCaseCsv.d.ts","sourceRoot":"","sources":["../../src/specs/writeCaseCsv.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,qBAAa,kBAAmB,SAAQ,KAAK;aACf,IAAI,EAAE,MAAM;aAAkB,IAAI,EAAE,MAAM;gBAA1C,IAAI,EAAE,MAAM,EAAkB,IAAI,EAAE,MAAM;CAIvE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B;;uEAEmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;+CAC2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAEnE,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiBzF"}
@@ -1,134 +0,0 @@
1
- /**
2
- * Save a completed Hover session as an Xray-compatible test case CSV
3
- * (one file per session, multi-row layout — one row per replayable step).
4
- *
5
- * Target: Atlassian Marketplace's #1 test management for Jira (Xray,
6
- * ~10M users, ~100M test cases / month). The same CSV imports cleanly
7
- * into Zephyr Scale and the original Jira issue importer with minor
8
- * column mapping, so this is the broadest single-format hand-off into
9
- * a team's test management.
10
- *
11
- * Schema (Xray Test Case Importer — multi-row layout):
12
- *
13
- * Issue Id unique grouping key, repeated on every row of the
14
- * same test case. We use the slug.
15
- * Summary the test case title; set on the FIRST row only.
16
- * Test Type "Manual" for everything Hover emits.
17
- * Priority "Medium" by default; PMs can edit post-import.
18
- * Labels space-separated; "hover" plus the user-supplied set.
19
- * Action one human-readable imperative per row. Reuses the
20
- * humanSteps helper that also feeds the .spec.ts JSDoc.
21
- * Expected Result attached to the LAST row of the case. Carries
22
- * assertion hints if present, else the agent's
23
- * done-summary first sentence.
24
- *
25
- * The "Issue Id" column is what tells Xray's importer that consecutive
26
- * rows belong to the same test, even though only the first row has a
27
- * Summary. The "Test Type" column tells it to instantiate the Manual
28
- * Test issue type and use the Step / Expected Result fields.
29
- */
30
- import { mkdir, writeFile } from 'node:fs/promises';
31
- import { existsSync } from 'node:fs';
32
- import { join } from 'node:path';
33
- import { humanSteps } from './humanSteps.js';
34
- import { slugify, firstSentence } from './text.js';
35
- export class CaseCsvExistsError extends Error {
36
- slug;
37
- path;
38
- constructor(slug, path) {
39
- super(`Test case CSV "${slug}" already exists at ${path}`);
40
- this.slug = slug;
41
- this.path = path;
42
- this.name = 'CaseCsvExistsError';
43
- }
44
- }
45
- export async function writeCaseCsv(opts) {
46
- const slug = slugify(opts.name);
47
- if (!slug)
48
- throw new Error('case name must contain at least one alphanumeric character');
49
- if (!opts.steps.some(s => s.kind === 'step')) {
50
- throw new Error('case must contain at least one tool step to describe');
51
- }
52
- const dir = join(opts.devRoot, '__vibe_tests__');
53
- const path = join(dir, `${slug}.case.csv`);
54
- if (!opts.overwrite && existsSync(path)) {
55
- throw new CaseCsvExistsError(slug, path);
56
- }
57
- await mkdir(dir, { recursive: true });
58
- const csv = renderCsv(slug, opts);
59
- await writeFile(path, csv, 'utf-8');
60
- return { path, slug };
61
- }
62
- // ───────── helpers ─────────
63
- function renderCsv(slug, opts) {
64
- const rows = buildRows(slug, opts);
65
- // CRLF row terminator — what Excel / Numbers / Xray's importer all
66
- // assume by default. Comma column delimiter, fields with commas or
67
- // newlines get wrapped in double-quotes (escaped by doubling).
68
- const header = ['Issue Id', 'Summary', 'Test Type', 'Priority', 'Labels', 'Action', 'Expected Result'];
69
- const lines = [header.map(escapeField).join(',')];
70
- for (const r of rows)
71
- lines.push(r.map(escapeField).join(','));
72
- return lines.join('\r\n') + '\r\n';
73
- }
74
- function buildRows(slug, opts) {
75
- const actions = humanSteps(opts.steps);
76
- const summary = opts.description?.trim() || opts.name;
77
- const expectedTail = expectedFor(opts.assertions ?? [], opts.steps);
78
- const labels = buildLabels(opts.jiraProjectKey, opts.labels);
79
- // Multi-row layout: one row per Action. First row carries the
80
- // test-case-level fields (Summary, Test Type, Priority, Labels); the
81
- // rest carry only the Issue Id + Action so Xray groups them.
82
- if (actions.length === 0) {
83
- // Defensive — writeCaseCsv() already throws on no replayable steps,
84
- // but keep a single-row fallback so the file is still well-formed.
85
- return [[slug, summary, 'Manual', 'Medium', labels, '(no replayable steps were captured)', expectedTail]];
86
- }
87
- const rows = [];
88
- actions.forEach((action, i) => {
89
- const isFirst = i === 0;
90
- const isLast = i === actions.length - 1;
91
- rows.push([
92
- slug,
93
- isFirst ? summary : '',
94
- isFirst ? 'Manual' : '',
95
- isFirst ? 'Medium' : '',
96
- isFirst ? labels : '',
97
- action,
98
- isLast ? expectedTail : '',
99
- ]);
100
- });
101
- return rows;
102
- }
103
- function expectedFor(assertions, steps) {
104
- if (assertions.length > 0) {
105
- return assertions.map(a => `• ${a.hint ?? a.code}`).join('\n');
106
- }
107
- const done = [...steps].reverse().find(s => s.kind === 'done');
108
- if (done?.summary) {
109
- return firstSentence(done.summary);
110
- }
111
- return '';
112
- }
113
- function buildLabels(jiraProjectKey, labels) {
114
- const set = new Set(['hover']);
115
- if (jiraProjectKey?.trim())
116
- set.add(jiraProjectKey.trim().toLowerCase());
117
- if (labels?.trim()) {
118
- labels.split(/[\s,]+/).filter(Boolean).forEach(l => set.add(l.toLowerCase()));
119
- }
120
- // Xray and Jira both accept space-separated labels in a single cell.
121
- return [...set].join(' ');
122
- }
123
- /**
124
- * RFC 4180 escaping: any field containing a quote, comma, CR, or LF
125
- * gets wrapped in double-quotes; embedded quotes are doubled.
126
- */
127
- function escapeField(value) {
128
- if (value === '')
129
- return '';
130
- if (/[",\r\n]/.test(value)) {
131
- return `"${value.replace(/"/g, '""')}"`;
132
- }
133
- return value;
134
- }