feat(skills): pql board copy-ref — one-gesture 'viewing T-NNN' handoff to Claude
The artifact tab is sandboxed (no phone-home), so Claude cannot query the tab's live selection; the copy-ref button in the ticket header copies 'viewing T-NNN — title' for a click-paste handoff (clipboard API with prompt fallback). Selection also remains in the URL hash. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+14
-1
@@ -138,6 +138,10 @@ PAGE = """<title>Settled Reach — pql board</title>
|
||||
#d-idrow { display: flex; align-items: center; gap: 10px; margin: 6px 0 2px; }
|
||||
#d-id { font: 700 15px var(--mono); color: var(--accent); }
|
||||
#d-prio { font: 10px/1 var(--mono); letter-spacing: .08em; text-transform: uppercase; }
|
||||
#d-copy { margin-left: auto; font: 10px/1 var(--mono); letter-spacing: .06em;
|
||||
text-transform: uppercase; background: none; border: 1px solid var(--line);
|
||||
border-radius: 3px; color: var(--dim); padding: 5px 9px; cursor: pointer; }
|
||||
#d-copy:hover { color: var(--accent); border-color: var(--accent-dim); }
|
||||
#d-title { font: 600 21px/1.3 var(--sans); text-wrap: balance; margin: 2px 0 14px;
|
||||
max-width: 46ch; }
|
||||
#d-status { display: flex; border: 1px solid var(--line); border-radius: 3px;
|
||||
@@ -289,7 +293,8 @@ function select(id, push=true){
|
||||
(ch.length?`<div class="d-chain">${ch.map(p=>`<a href="#${esc(p)}">${esc(p)}</a>`).join(" → ")}</div>`:"")+
|
||||
`<div id="d-idrow"><span class="dot" style="background:var(--t-${t.type});width:9px;height:9px"></span>`+
|
||||
`<span id="d-id">${esc(t.id)}</span>`+
|
||||
`<span id="d-prio" style="color:${t.priority==="critical"?"var(--t-bug)":t.priority==="high"?"var(--accent)":"var(--dim)"}">${esc(t.priority||"")}</span></div>`+
|
||||
`<span id="d-prio" style="color:${t.priority==="critical"?"var(--t-bug)":t.priority==="high"?"var(--accent)":"var(--dim)"}">${esc(t.priority||"")}</span>`+
|
||||
`<button id="d-copy" title="Copy a 'viewing …' line to paste to Claude">copy ref</button></div>`+
|
||||
`<div id="d-title">${esc(t.title)}</div>`+
|
||||
`<div id="d-status">${STATUSES.map(s=>`<span class="${s===t.status?"on":""}">${s.replace("_"," ")}</span>`).join("")}</div>`+
|
||||
`<dl id="d-meta">${meta.map(([k,v])=>`<dt>${k}</dt><dd>${v}</dd>`).join("")}</dl>`+
|
||||
@@ -300,6 +305,14 @@ function select(id, push=true){
|
||||
`<div id="d-desc">${(t.description||"—").split(/\\n\\n+/).map(p=>`<p>${esc(p).replace(/\\n/g,"<br>")}</p>`).join("")}</div>`;
|
||||
d.scrollTop=0;
|
||||
d.querySelectorAll(".tchip[data-id]").forEach(el=>el.onclick=()=>select(el.dataset.id));
|
||||
const cp=document.getElementById("d-copy");
|
||||
cp.onclick=()=>{
|
||||
const txt=`viewing ${t.id} — ${t.title}`;
|
||||
const done=()=>{ cp.textContent="copied"; setTimeout(()=>{cp.textContent="copy ref";},1200); };
|
||||
if(navigator.clipboard&&navigator.clipboard.writeText)
|
||||
navigator.clipboard.writeText(txt).then(done,()=>window.prompt("Copy:",txt));
|
||||
else window.prompt("Copy:",txt);
|
||||
};
|
||||
const card=document.querySelector(`.card[data-id="${CSS.escape(id)}"]`);
|
||||
if(card) card.scrollIntoView({block:"nearest"});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user