linear-grab 0.20.0 → 0.20.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.
- package/README.md +1 -1
- package/bin/linear-grab-bridge.mjs +102 -2
- package/dist/index.global.js +5 -5
- package/dist/linear-grab.js +26 -19
- package/package.json +1 -1
package/dist/linear-grab.js
CHANGED
|
@@ -25754,7 +25754,7 @@ function pD(e) {
|
|
|
25754
25754
|
return i.length && t.push(i.join(" ")), t.join("\n\n");
|
|
25755
25755
|
}
|
|
25756
25756
|
var mD, hD, gD = t((() => {
|
|
25757
|
-
mD = "You are an expert engineer drafting a Linear issue for a development team.\nYou are given a rough note from the reporter and, when available, the exact React source\nlocation of the UI element the issue is about (captured from a running dev build).\n\nWrite a crisp, actionable issue a coding agent can execute against with zero follow-up\nquestions. Be specific, never invent details you were not given, and keep the tone neutral\nand technical. If the note implies a bug, structure it as a bug; if it implies a change or\nfeature, keep reproSteps minimal and focus the description on the desired change.\n\nThe issue renders in this exact section order — fill each field for its section:\nSummary (description field) → Steps to Reproduce (reproSteps) → Expected Behavior\n(expected) → Actual Behavior (actual) → Impact (impact) → Analysis / Notes\n(analysisNotes, markdown bullets grounded in the provided source context) →\nSuggested Next Steps (suggestedNextSteps, markdown bullets with concrete fixes).\nThe Summary is a short plain-prose paragraph — no headings inside it, no repetition\nof the other sections.", hD = "- FIRST, self-orient in the repo checkout (skip any path that doesn't exist):\n 1. Read `CLAUDE.md` and `AGENTS.md` at the repo root — the master map of product rules, architecture, and memory/skill pointers.\n 2. Skim `.claude/memory/MEMORY.md` (the index) to learn what project memory exists; load the specific `.claude/memory/*.md` files the map names for the surface you're touching.\n 3. Load the matching `.claude/skills/<name>/SKILL.md` files before designing, building UI, or animating (if skills are symlinked, follow them into `.agents/skills/`).\n Treat all of this as authoritative — it overrides your defaults.\n- Keep going until the code works and you're happy with the implementation.\n- MANDATORY COMPLETION GATE — the task is NOT complete (and you may not call it complete) until every step below is done, in order. Skipping any step silently is a FAILED task:\n 1. RUN the app and TEST your change hands-on (computer use / a real browser against the running app). Code reading alone does not count as verification.\n 2. RECORD a demo video or GIF showing the fix working (before → after where possible). If your environment genuinely cannot record media, capture before/after screenshots instead AND state explicitly in your closeout comment why video was not possible — never just omit the demo.\n 3. Open the PR, babysit it for the first set of review comments, and address them. If the repo has preview deployments (e.g. Vercel), wait for the preview to go green and include its URL — deep-linked to the changed page — in the PR body, the Linear closeout, and the announcement.\n 4. CLOSE OUT THE LINEAR ISSUE: post a completion comment (one-line fix summary + PR link), attach the demo media to the ISSUE itself (not only the PR), and move the issue to its review/done state.";
|
|
25757
|
+
mD = "You are an expert engineer drafting a Linear issue for a development team.\nYou are given a rough note from the reporter and, when available, the exact React source\nlocation of the UI element the issue is about (captured from a running dev build).\n\nWrite a crisp, actionable issue a coding agent can execute against with zero follow-up\nquestions. Be specific, never invent details you were not given, and keep the tone neutral\nand technical. If the note implies a bug, structure it as a bug; if it implies a change or\nfeature, keep reproSteps minimal and focus the description on the desired change.\n\nThe issue renders in this exact section order — fill each field for its section:\nSummary (description field) → Steps to Reproduce (reproSteps) → Expected Behavior\n(expected) → Actual Behavior (actual) → Impact (impact) → Analysis / Notes\n(analysisNotes, markdown bullets grounded in the provided source context) →\nSuggested Next Steps (suggestedNextSteps, markdown bullets with concrete fixes).\nThe Summary is a short plain-prose paragraph — no headings inside it, no repetition\nof the other sections.", hD = "- FIRST, self-orient in the repo checkout (skip any path that doesn't exist):\n 1. Read `CLAUDE.md` and `AGENTS.md` at the repo root — the master map of product rules, architecture, and memory/skill pointers.\n 2. Skim `.claude/memory/MEMORY.md` (the index) to learn what project memory exists; load the specific `.claude/memory/*.md` files the map names for the surface you're touching.\n 3. Load the matching `.claude/skills/<name>/SKILL.md` files before designing, building UI, or animating (if skills are symlinked, follow them into `.agents/skills/`).\n Treat all of this as authoritative — it overrides your defaults.\n- Live render telemetry (react-scan → linear-grab bridge): if `.lineargrab/scan.ndjson` exists in the repo, it holds the user's REAL interaction slowdowns — component render counts, self-times, change causes (`prop:x`/`state:i`/`context:y`), and interaction latencies, newest last. `curl -s http://127.0.0.1:4577/scan/report` returns an aggregated view. For any re-render/performance issue: read it BEFORE fixing (the evidence) and AFTER (the proof), and cite before→after numbers in your closeout.\n- Keep going until the code works and you're happy with the implementation.\n- MANDATORY COMPLETION GATE — the task is NOT complete (and you may not call it complete) until every step below is done, in order. Skipping any step silently is a FAILED task:\n 1. RUN the app and TEST your change hands-on (computer use / a real browser against the running app). Code reading alone does not count as verification.\n 2. RECORD a demo video or GIF showing the fix working (before → after where possible). If your environment genuinely cannot record media, capture before/after screenshots instead AND state explicitly in your closeout comment why video was not possible — never just omit the demo.\n 3. Open the PR, babysit it for the first set of review comments, and address them. If the repo has preview deployments (e.g. Vercel), wait for the preview to go green and include its URL — deep-linked to the changed page — in the PR body, the Linear closeout, and the announcement.\n 4. CLOSE OUT THE LINEAR ISSUE: post a completion comment (one-line fix summary + PR link), attach the demo media to the ISSUE itself (not only the PR), and move the issue to its review/done state.";
|
|
25758
25758
|
})), _D = /* @__PURE__ */ r({
|
|
25759
25759
|
describeAiError: () => bD,
|
|
25760
25760
|
executeDraft: () => vD
|
|
@@ -41930,7 +41930,7 @@ function vQ() {
|
|
|
41930
41930
|
let e = HD().result;
|
|
41931
41931
|
if (!e) throw Error("No recording available.");
|
|
41932
41932
|
if (e.assetUrl) return e.assetUrl;
|
|
41933
|
-
let t = await DO(e.blob, `recording-${Date.now()}.gif`);
|
|
41933
|
+
let t = await Promise.race([DO(e.blob, `recording-${Date.now()}.gif`), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("upload timed out")), 6e4))]);
|
|
41934
41934
|
return rO(t), t;
|
|
41935
41935
|
}, k = async () => {
|
|
41936
41936
|
w(null), S("busy");
|
|
@@ -43132,20 +43132,27 @@ function i$(e, t = 6e3) {
|
|
|
43132
43132
|
return Promise.race([e, new Promise((e, n) => setTimeout(() => n(/* @__PURE__ */ Error("upload timeout")), t))]);
|
|
43133
43133
|
}
|
|
43134
43134
|
async function a$() {
|
|
43135
|
-
let e = [];
|
|
43136
|
-
for (let
|
|
43137
|
-
let
|
|
43138
|
-
if (e.push(`- \`<${
|
|
43139
|
-
let
|
|
43140
|
-
e.push(`  ?? []) {
|
|
43137
|
+
let r = n.source?.filePath ? ` — \`${n.source.filePath}${n.source.lineNumber == null ? "" : `:${n.source.lineNumber}`}\`` : "";
|
|
43138
|
+
if (e.push(`- \`<${n.componentName ?? n.tagName ?? "element"}>\`${r}`), n.screenshotDataUrl) try {
|
|
43139
|
+
let t = await i$(DO(ej(n.screenshotDataUrl), `capture-${n.grabbedAt}.png`), 15e3);
|
|
43140
|
+
e.push(` `);
|
|
43141
|
+
} catch {
|
|
43142
|
+
t.push("element screenshot upload failed — the ref line still landed");
|
|
43143
|
+
}
|
|
43142
43144
|
}
|
|
43143
|
-
let
|
|
43144
|
-
if (
|
|
43145
|
-
let
|
|
43146
|
-
rO(
|
|
43147
|
-
} catch {
|
|
43148
|
-
|
|
43145
|
+
let n = HD();
|
|
43146
|
+
if (n.result) try {
|
|
43147
|
+
let t = n.result.assetUrl ?? await i$(DO(n.result.blob, `recording-${Date.now()}.gif`), 6e4);
|
|
43148
|
+
rO(t), e.push(``);
|
|
43149
|
+
} catch (e) {
|
|
43150
|
+
t.push(`recording upload failed (${e instanceof Error ? e.message : "error"}) — Copy GIF from the Capture tab and paste it instead`);
|
|
43151
|
+
}
|
|
43152
|
+
return {
|
|
43153
|
+
block: e.length ? `Captured context:\n${e.join("\n")}` : null,
|
|
43154
|
+
failed: t
|
|
43155
|
+
};
|
|
43149
43156
|
}
|
|
43150
43157
|
//#endregion
|
|
43151
43158
|
//#region src/panel/components/markdown.ts
|
|
@@ -43573,8 +43580,8 @@ function p1(e) {
|
|
|
43573
43580
|
})), [C, w] = T(!1), E = async () => {
|
|
43574
43581
|
w(!0), y(null);
|
|
43575
43582
|
try {
|
|
43576
|
-
let e = await a$();
|
|
43577
|
-
e ? _((t) => `${t ? `${t}\n` : ""}${e}\n`) : y("Nothing captured yet — pick an element, capture a region, or record first.");
|
|
43583
|
+
let { block: e, failed: t } = await a$();
|
|
43584
|
+
e ? _((t) => `${t ? `${t}\n` : ""}${e}\n`) : t.length || y("Nothing captured yet — pick an element, capture a region, or record first."), t.length && y(t.join(" · "));
|
|
43578
43585
|
} catch (e) {
|
|
43579
43586
|
y(e instanceof Error ? e.message : "Attach failed.");
|
|
43580
43587
|
} finally {
|
|
@@ -44694,8 +44701,8 @@ function v0() {
|
|
|
44694
44701
|
let y = async () => {
|
|
44695
44702
|
m(!0);
|
|
44696
44703
|
try {
|
|
44697
|
-
let e = await a$();
|
|
44698
|
-
e && f((t) => `${t ? `${t}\n` : ""}${e}\n`);
|
|
44704
|
+
let { block: e, failed: t } = await a$();
|
|
44705
|
+
e && f((t) => `${t ? `${t}\n` : ""}${e}\n`), t.length && f((e) => `${e}\n<!-- upload issues: ${t.join(" · ")} -->\n`);
|
|
44699
44706
|
} finally {
|
|
44700
44707
|
m(!1);
|
|
44701
44708
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "linear-grab",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Point at any React element in your dev app, draft a Linear issue with AI, delegate it to the Cursor agent, and track it live — in any browser.",
|
|
6
6
|
"exports": {
|