@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.
- package/README.md +26 -55
- package/dist/agentDirectives.d.ts +55 -0
- package/dist/agentDirectives.d.ts.map +1 -0
- package/dist/agentDirectives.js +276 -0
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +28 -3
- package/dist/agents/codex.d.ts.map +1 -1
- package/dist/agents/codex.js +29 -14
- package/dist/agents/invoke.d.ts.map +1 -1
- package/dist/agents/invoke.js +3 -6
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +0 -4
- package/dist/agents/types.d.ts +19 -11
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/engine.d.ts +53 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +78 -0
- package/dist/mcp/actuateServer.d.ts +3 -0
- package/dist/mcp/actuateServer.d.ts.map +1 -0
- package/dist/mcp/actuateServer.js +594 -0
- package/dist/mcp/sourceFence.d.ts.map +1 -1
- package/dist/mcp/sourceFence.js +4 -0
- package/dist/mcp/sourceServer.js +75 -0
- package/dist/memory/businessMemory.d.ts +29 -0
- package/dist/memory/businessMemory.d.ts.map +1 -0
- package/dist/memory/businessMemory.js +125 -0
- package/dist/modes.d.ts +39 -0
- package/dist/modes.d.ts.map +1 -0
- package/dist/modes.js +34 -0
- package/dist/playwright/cdpStatus.d.ts +0 -15
- package/dist/playwright/cdpStatus.d.ts.map +1 -1
- package/dist/playwright/cdpStatus.js +0 -67
- package/dist/playwright/launchChrome.d.ts +18 -0
- package/dist/playwright/launchChrome.d.ts.map +1 -1
- package/dist/playwright/launchChrome.js +46 -3
- package/dist/playwright/resolveMcpConfig.d.ts +7 -1
- package/dist/playwright/resolveMcpConfig.d.ts.map +1 -1
- package/dist/playwright/resolveMcpConfig.js +22 -4
- package/dist/plugin-api.d.ts +28 -26
- package/dist/plugin-api.d.ts.map +1 -1
- package/dist/plugin-api.js +2 -2
- package/dist/qa/candidates.d.ts +32 -0
- package/dist/qa/candidates.d.ts.map +1 -0
- package/dist/qa/candidates.js +20 -0
- package/dist/qa/classify.d.ts +38 -0
- package/dist/qa/classify.d.ts.map +1 -0
- package/dist/qa/classify.js +138 -0
- package/dist/qa/intensity.d.ts +33 -0
- package/dist/qa/intensity.d.ts.map +1 -0
- package/dist/qa/intensity.js +25 -0
- package/dist/qa/qaReport.d.ts +19 -0
- package/dist/qa/qaReport.d.ts.map +1 -0
- package/dist/qa/qaReport.js +50 -0
- package/dist/runSession.d.ts +14 -3
- package/dist/runSession.d.ts.map +1 -1
- package/dist/runSession.js +26 -11
- package/dist/service/cdpHandlers.d.ts +1 -21
- package/dist/service/cdpHandlers.d.ts.map +1 -1
- package/dist/service/cdpHandlers.js +4 -39
- package/dist/service/cdpHint.d.ts +21 -28
- package/dist/service/cdpHint.d.ts.map +1 -1
- package/dist/service/cdpHint.js +106 -164
- package/dist/service/relayHandlers.d.ts +28 -0
- package/dist/service/relayHandlers.d.ts.map +1 -0
- package/dist/service/relayHandlers.js +105 -0
- package/dist/service/saveHandlers.d.ts +1 -3
- package/dist/service/saveHandlers.d.ts.map +1 -1
- package/dist/service/saveHandlers.js +17 -15
- package/dist/service/types.d.ts +108 -8
- package/dist/service/types.d.ts.map +1 -1
- package/dist/service.d.ts +7 -3
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +907 -200
- package/dist/sessions/sessions.d.ts +125 -0
- package/dist/sessions/sessions.d.ts.map +1 -0
- package/dist/sessions/sessions.js +175 -0
- package/dist/specs/authFixture.d.ts +30 -0
- package/dist/specs/authFixture.d.ts.map +1 -0
- package/dist/specs/authFixture.js +145 -0
- package/dist/specs/businessMap.d.ts +29 -0
- package/dist/specs/businessMap.d.ts.map +1 -0
- package/dist/specs/businessMap.js +95 -0
- package/dist/specs/detectSharedFlows.d.ts +1 -1
- package/dist/specs/detectSharedFlows.d.ts.map +1 -1
- package/dist/specs/detectSharedFlows.js +20 -21
- package/dist/specs/generatePageObject.d.ts +1 -1
- package/dist/specs/generatePageObject.d.ts.map +1 -1
- package/dist/specs/healPrompt.d.ts +19 -0
- package/dist/specs/healPrompt.d.ts.map +1 -0
- package/dist/specs/healPrompt.js +48 -0
- package/dist/specs/humanSteps.d.ts +4 -8
- package/dist/specs/humanSteps.d.ts.map +1 -1
- package/dist/specs/humanSteps.js +6 -1
- package/dist/specs/optimizeSpec.d.ts +15 -8
- package/dist/specs/optimizeSpec.d.ts.map +1 -1
- package/dist/specs/optimizeSpec.js +71 -41
- package/dist/specs/optimizeSpecWithAgent.d.ts +0 -2
- package/dist/specs/optimizeSpecWithAgent.d.ts.map +1 -1
- package/dist/specs/optimizeSpecWithAgent.js +0 -1
- package/dist/specs/pageObjectManifest.d.ts +3 -1
- package/dist/specs/pageObjectManifest.d.ts.map +1 -1
- package/dist/specs/pageObjectManifest.js +13 -9
- package/dist/specs/replayGrounded.d.ts +45 -0
- package/dist/specs/replayGrounded.d.ts.map +1 -0
- package/dist/specs/replayGrounded.js +155 -0
- package/dist/specs/runFailures.d.ts +34 -0
- package/dist/specs/runFailures.d.ts.map +1 -0
- package/dist/specs/runFailures.js +93 -0
- package/dist/specs/seeds.d.ts +16 -15
- package/dist/specs/seeds.d.ts.map +1 -1
- package/dist/specs/seeds.js +86 -54
- package/dist/specs/sidecar.d.ts +34 -6
- package/dist/specs/sidecar.d.ts.map +1 -1
- package/dist/specs/sidecar.js +79 -9
- package/dist/specs/specStep.d.ts +21 -0
- package/dist/specs/specStep.d.ts.map +1 -0
- package/dist/specs/specStep.js +1 -0
- package/dist/specs/text.d.ts +8 -6
- package/dist/specs/text.d.ts.map +1 -1
- package/dist/specs/text.js +10 -7
- package/dist/specs/writeSpec.d.ts +62 -1
- package/dist/specs/writeSpec.d.ts.map +1 -1
- package/dist/specs/writeSpec.js +596 -21
- package/package.json +6 -9
- package/dist/agents/aider.d.ts +0 -16
- package/dist/agents/aider.d.ts.map +0 -1
- package/dist/agents/aider.js +0 -161
- package/dist/agents/cursor.d.ts +0 -18
- package/dist/agents/cursor.d.ts.map +0 -1
- package/dist/agents/cursor.js +0 -220
- package/dist/playwright/raiseWindow.d.ts +0 -10
- package/dist/playwright/raiseWindow.d.ts.map +0 -1
- package/dist/playwright/raiseWindow.js +0 -158
- package/dist/scripts/bench-multi-tab.d.ts +0 -2
- package/dist/scripts/bench-multi-tab.d.ts.map +0 -1
- package/dist/scripts/bench-multi-tab.js +0 -192
- package/dist/scripts/bench-ttfb.d.ts +0 -2
- package/dist/scripts/bench-ttfb.d.ts.map +0 -1
- package/dist/scripts/bench-ttfb.js +0 -127
- package/dist/scripts/start-chrome.d.ts +0 -3
- package/dist/scripts/start-chrome.d.ts.map +0 -1
- package/dist/scripts/start-chrome.js +0 -23
- package/dist/skills/writeSkill.d.ts +0 -27
- package/dist/skills/writeSkill.d.ts.map +0 -1
- package/dist/skills/writeSkill.js +0 -13
- package/dist/specs/listSpecs.d.ts +0 -52
- package/dist/specs/listSpecs.d.ts.map +0 -1
- package/dist/specs/listSpecs.js +0 -139
- package/dist/specs/optimizationSuggestion.d.ts +0 -26
- package/dist/specs/optimizationSuggestion.d.ts.map +0 -1
- package/dist/specs/optimizationSuggestion.js +0 -28
- package/dist/specs/writeCaseCsv.d.ts +0 -28
- package/dist/specs/writeCaseCsv.d.ts.map +0 -1
- 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
|
-
}
|