fenix-claude-plugin 0.1.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/.claude-plugin/plugin.json +13 -0
- package/.mcp.json +11 -0
- package/README.md +55 -0
- package/artifacts/practice-dashboard.html +469 -0
- package/artifacts/project-overview.html +481 -0
- package/artifacts/user-dashboard.html +368 -0
- package/commands/fenix-install.md +15 -0
- package/commands/fenix-setup.md +14 -0
- package/package.json +16 -0
- package/skills/fenix-application/CUSTOMIZE.md +1 -0
- package/skills/fenix-application/SKILL.md +95 -0
- package/skills/fenix-application/VERSION +1 -0
- package/skills/fenix-application/assets/claims_editor.html +87 -0
- package/skills/fenix-application/assets/figures_editor.html +87 -0
- package/skills/fenix-application/assets/spec_editor.html +87 -0
- package/skills/fenix-application/references/claims.md +30 -0
- package/skills/fenix-application/references/disclosure.md +33 -0
- package/skills/fenix-application/references/editors.md +52 -0
- package/skills/fenix-application/references/figure-description.md +67 -0
- package/skills/fenix-application/references/figures-guidance.md +122 -0
- package/skills/fenix-application/references/figures.md +28 -0
- package/skills/fenix-application/references/patent-review-advantages.md +35 -0
- package/skills/fenix-application/references/patent-review-checklist.md +36 -0
- package/skills/fenix-application/references/patent-review-claim-formats.md +71 -0
- package/skills/fenix-application/references/patent-review-profanity.md +57 -0
- package/skills/fenix-application/references/patent-review.md +82 -0
- package/skills/fenix-application/references/patent-safe.md +44 -0
- package/skills/fenix-application/references/patent.md +18 -0
- package/skills/fenix-application/references/spec-guidance.md +195 -0
- package/skills/fenix-application/references/spec.md +48 -0
- package/skills/fenix-application/scripts/calculate_figure_layout.py +32 -0
- package/skills/fenix-application/scripts/parse_claims.py +39 -0
- package/skills/fenix-office-action/CUSTOMIZE.md +1 -0
- package/skills/fenix-office-action/SKILL.md +40 -0
- package/skills/fenix-office-action/VERSION +1 -0
- package/skills/fenix-office-action/references/oa-response.md +10 -0
- package/skills/fenix-project/CUSTOMIZE.md +1 -0
- package/skills/fenix-project/SKILL.md +41 -0
- package/skills/fenix-project/VERSION +1 -0
- package/skills/fenix-project/references/create-project.md +10 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>Claims Editor</title>
|
|
6
|
+
<style>*{box-sizing:border-box;margin:0;padding:0}body{font-family:system-ui,-apple-system,sans-serif;background:#fff7ed;min-height:100vh;padding:20px 16px}.card{background:#fff;max-width:900px;margin:0 auto;border-radius:10px;box-shadow:0 1px 4px rgba(0,0,0,.12);overflow:hidden}.hdr{display:flex;align-items:center;gap:12px;padding:14px 20px;border-bottom:1px solid #fed7aa}.hdr img{height:26px;width:auto}.hdiv{width:1px;height:22px;background:#fed7aa;flex-shrink:0}.hdr h1{font-size:15px;font-weight:600;color:#1e293b}.hdr .toggle-all{margin-left:auto;flex-shrink:0}.bdy{padding:20px}.sub{font-size:13px;color:#64748b;margin-bottom:14px}input,select,textarea{font-family:inherit;font-size:13px;border:1.5px solid #fed7aa;border-radius:5px;padding:6px 10px;outline:none;width:100%;transition:border-color .15s;background:#fff}input:focus,select:focus,textarea:focus{border-color:#ea580c}.row2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}.field{margin-bottom:12px}label{display:block;font-size:12px;font-weight:600;color:#374151;margin-bottom:4px}.acc{border:1px solid #fed7aa;overflow:hidden;margin-bottom:-1px}.acc-hd{display:flex;align-items:center;gap:10px;padding:11px 14px;cursor:pointer;background:#fffbf5;user-select:none}.acc-hd:hover{background:#fff7ed}.acc-hd .chev{color:#ea580c;font-size:12px;transition:transform .15s;flex-shrink:0}.acc.open .chev{transform:rotate(90deg)}.acc-hd .ttl{font-weight:600;font-size:13px;color:#1e293b;flex-shrink:0}.acc-hd .prev{font-size:12px;color:#94a3b8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.acc-hd .badge{font-size:11px;font-weight:600;padding:1px 8px;border-radius:10px;background:#ffedd5;color:#c2410c;flex-shrink:0}.acc-bd{display:none;padding:14px;border-top:1px solid #fed7aa;background:#fff}.acc.open .acc-bd{display:block}table{width:100%;border-collapse:collapse;margin-top:8px}th,td{padding:6px 10px;border:1px solid #fed7aa;font-size:13px;text-align:left}th{background:#fff7ed;font-weight:600;color:#374151}td input{border:none;padding:0;width:100%;background:transparent}td input:focus{outline:1px solid #ea580c;border-radius:3px}.tbl-bar{display:flex;justify-content:space-between;align-items:center;margin-top:8px}.btn-sm{padding:4px 12px;background:#fff;border:1.5px solid #fed7aa;border-radius:5px;font-size:12px;cursor:pointer;color:#374151}.btn-sm:hover{border-color:#ea580c}.del-btn{color:#dc2626;background:none;border:none;cursor:pointer;font-size:16px;line-height:1;padding:0 4px}.rm-item{margin-left:auto;color:#dc2626;background:none;border:none;cursor:pointer;font-size:13px;flex-shrink:0}.bar{margin-top:16px;display:flex;align-items:center;gap:14px}.cta{padding:9px 24px;background:#ea580c;color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s}.cta:hover{background:#c2410c}#st{color:#16a34a;font-size:13px;font-weight:500}textarea.sec{min-height:200px;font-family:Menlo,Consolas,monospace;line-height:1.6;resize:vertical}.addbar{margin:6px 0 4px}.ftr{padding:9px 20px;border-top:1px solid #fed7aa;font-size:11px;color:#94a3b8;display:flex;justify-content:space-between}</style>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="card">
|
|
10
|
+
<div class="hdr"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAANB0lEQVR42tWaf4xc1XXHP+fe92ZmZ2Y9XrO/7NhOjQHB2jG0Ng2igO0QJNoilKbMrm1MfghwU5KKEqWhNGnXS5u0TVQ1UqIEXEUKbSTsnQqJNm2pgsRukwa1MlEbjFNSfqQE2/vDsN7dmd2Zee/e0z/em/WmKfHaXlvwpNVIs+/dd773nPM933PmwkW+FIR36vWjW8me6C9sBtB9hCcHilddaFDmQiw6XMYqSGnlip1i5AYADhBHqneeLLe9Sy4gqAsCqNyHCqh6/4BR3gAQUCN0OmPuBXRkO/YdAWi4jJUhdGpP/prQ8n4renRRBr1k4ONaJrNjFHchvLTsgMqp5U1vfg+gLjLe+p94fthZMJ3jUijLBfLSsgLSQYxUcG+WO9ZnDHdEyok1mWp14QYJT9QjQOQBHcTsGMW9rQGNjCTrRaZ578qcZASOy2PUdTD53ilTM5HOt4dsPflfhZ0CquXl9ZI535rSygMF2TlK/MPbaQc+5BygeiJBmryn3mQKZSpnBafcB0AfurDeMoAz51Mcx/YWuqZ2Fd4DwD4CgM5C4fZiaNZHHgReX/zcN56cnhHhjXmnWMOtJ8qlDTKEH06BTJri9Ye3El58D7X2NKYrUm4CYHXyrffyEb9wgxxbnF9D4IHjqlAMTd4at7tFJAqCsL370mRjLi6g/YmHAkO3CtcCyBDxeHnFZdZw41yEl2T1iYVnji5Q9HhghIZTFAZaRHLydooK19czq8LzURPnBig1TtSsMyJbF7xg3K+3h5IVIfIKPi2qdKNMpLmmnLICdY+zhs2nXsxfDeCzK3pU9dp8PFcC2D94MQGlxnmv6/BsPLG3p5CqgZu9girGqYLqzM88KzoLYJRoRSgmxr4PIAx8b3toOgMTrgXYdPRiAkovj27MB5KLdaZDQQTZ0kzqv3EKYqUOUPmp9JNocSp69FqAptf1+QwY598N0DVxEQClcS2kBdEIV+UCyKn0HN9Hm4quijWxWgFV8W+5mCCxB0HXARgjGzCCCpsAdvyfsnBBAAmopp+n9pQ6VOVSK6BerijOt7cJUvApwVkB6312kRxK11Db2hyviiorU3dfjlcE2UaCyAuJyF12QK1dmuxvu/Yn5bU5gHnia0JDV+QBlV+Zd81SaDDaslqEWH37zy4mxXRzUECEzLHbVue96nsbEXi4+uSdq1bIEH5yV9uasV2FLQCDg0uzdWkeShlHjb2vaKcuBzCemwuhSDVSEG4N1V7uThcgDQxYE3QBjEwgdJNiZVUSjkgSS1IP8rUbs4FcOR2pKwSy2rn69Ql2+2sWcwvA/pHlBDSUGqp6nYNbUo9drQqREgfCRqfmQ06Zs7IQnnjVta182N+SOMJapwu3oKpG8fdnjAC4rAVULktYlD2Kv3RZQy5hLzRJUCl55Y40rl3LqtTAAYScT9H6JJz6FvZkCH/sNvKKXtFMEs3UHSByhTH8ai1WJLFHVaWu2wlylhtUpZTIwWUmheP7aANcMTTXvT6QWwf6vYxNkLV4wIBNw8k0YvWqevVwGdtiRWkr/oIR6Wk6vEiSb4bTUkcV40Ek8IdP9OZ3l/ImFDQHMNm9NHJYMqBsbVUgQNZCVoKvOme+NRtpbASrKaYUnCKoCOaSnLnyJmm/tsVUgeEDnQWTScG4xbJQFV8MxUw3/FHv3KmcMX8eRYqXhETKfcsMKGFWgumm0h7KbdZydz3mYCEQkSTC8IpaQVaEYhueF+Yi/zCBmSCtJ2r4l9l5/xWB8VJGLIpfkLFJRkWIfjMgPJC1sroZgznLOrRkZXtJ8GZzMi42rMBMpC5n+WQj5vlapE2BjFN8zmJUqVUj/2Cnq/2VVGguqmHwePW7wHdfLec/J2I+kw/5xHyM9yCBYGYjnTEid+dDNs5GGq3MSIhLpBJLlELBUih7EESGqI/v0onAmPUNr9Qdmgt4T8Ml4ZK1iMKbjVhu661UnwXQ7QSM4lohp4MYRjBSmRsDfmdyV/GFrJWvNby6WDGBkZWBsLIa4UUQIyjwCgCvYJSk2J5zyA2CkSH8/qOpBFH+OTVcBaQeJ2kjAlbwc87v7q3MPnukTEZBZJR4sQEyhGcHXstY3UfYdbD6SC3yn2sPxCZaFxo+yT9Amh5x8JQOYuQ5ohbbnkHNvDVdj+3tyUtUe3/voeqTAMc/mHt3JmOfN0aKkVt4cVzKSDDV9F/vPVi75/A+wm0HiFoeGRnB7Ehpd8cOvAzhF3R3GUMfMvFi4QdtVq6ajxP28+BWhmKnmv5fe0u1nXKAaOajxa75Of+L3VfOPc3QW0uit/RQpYxZ/c3xGmhhfKDwd//2gfZL1jxR/x8n+omCFRFJGQ1sLdJYPV9SRV6ZSgzWwcS7O0eJZZR45yixDOGn9mY3jO/JX6Op+pAhYrx8JWsFEbxXNGuwdaezbaH9iBwgmtxT2lqf0ydcYF6XIfzP65XkjGOpIfz4QGG0PSPrazF/Jsb9g4vNZ/OB/NZcTJwPCeYinu++snqNDOHT0EQEPbWndKn3/sYY3ayq7RkrG4DNkddPdZ2oVSrdaLmCnxxovxzRF9Kc9llDcy6SjweBfs+r7i0E5sG5SAe7D1U/r2WsVN56/PVzSaGS5s6YcJ/zcqQ94JGZyM4Db8y7pAUIRTCiR2UoyY0K0C+4sV3FQcF9Oh9KXkQW9m6q7m/pHa49rWDKqZrW0uzrE9PFsaxlbdMjdY8xVver513dbcacrOvLr5WqX9RBDKdD9uxJob+Cq5Qxqw/WXqg5PQTECrmsZW2rnUiKkFbTZLX9Fdx4f/Ghnrzsj5X8qaZG001txIqbavi/7x2uPX14H2GrdiUoaSA6Z5KsVyNkcpZ1Kuh8jEf5wrYDRCMjmPNiucUTGav6iCYejRoepy19lyDpFFCp0JzoL/2SsfrgG/P+1dgzVwgIFUwo2EDkWVVk64s/bdQUHUVUSi4Vjl7RekyUMTAb++mgbocVZCmT1jMCkkpSR6ama89ON/x3uvOSyQdiMwZBkYZXVNmiZTIAgTZO2sBtaczWNoPZUvd8O2sInIJXbYicBlMpYxREwsaGwNDd9KiCyVmkGEq4Mmcs8NWOJ6dPtSJiWZTCqx8mt+Ex6lC7aWpP4WHg5sjJRmvoaThcWyAbTsaF65XaqFTqr51W6TMvT/a3fznI6C0pzaxZXEfKE4mSH/fyGx0ZkammxgaCRqyvqOXHEzX+pudQ7RsAP/4wWR6jfl4eas2k2xqFO6b3FJ6YHCjuq0Xmn2InXxBhLDCJSgiM4JE/ENAjZTI6iHluK4GCOPxGm861FEmE6ghOUxV+bHexMxD5WDVOuvuMBRF5bj7WP3FGXz21p/jQ5EDxW/kof+Vim86NtkEYRH5ylGybKT7RWTK31uaU2CsKNP1CK+1WhGKnG/6B3uHal46UyWwC91wHZv1M4T+yVvoaDrVCvRlHm3ppvEYfmrTZhb9tD81vTkfqJG0/cha8QjEUglCYnPWf6T5U/XyrjJwzoMUNHsDJXcW/CK18MmNg3imRTySQglrBh0ZM0+tvdz1efRRgcnfxL1cE8rtTTfUi6MqM2Jmm/3rXwdo9Wsa+EbR/rRBw70wKpvXOjIG2QKjHeqoW+/vXDM/99VLALAlQC5RJJz4Tu4vbM8JHI+V9obCumb7CJ3RLeygy0/SPiMhYIZD9tVj9otDW0CCx1z/2yA2rMrLzzeZpz1hpzck4YuCpRmwe7anMvHSmYnrWgBa01yDS2qUTe3sKQVS9DqEiIiWvGE36GyllRBSYjVTl/3nHilCIFaqxOgGDorkA6rF+3xi5qzOu/ncLwNmAOdsGT1tq4EiZTO/G8Xkv9HfmTIdNRKpmLMYIOhOpm03CSFTxC39p6E5H6mqxOpvUJzGCETCljNnmVLdJBfejW8m2BvlnOTs8+9+GWoPGhrrdoXCsEetMxjDhkXtLGbn/zaY6k0QQuXTu0Bqc1N1CWLmsxTaaepez/ABPd8HSWVMT9LjZx6mcufdZFkCc4aBFR0fx39ssW2oRHkFRfREwCCpK1hi5NPbEq7ISTDX8oz2Hah972/wk+cx2Ai1jh8tY3Up4xVM0UHd35IlF0DaLYOSPug/V+noO1vq8yj+2WSFrsTNNfYlL8p/SMra1TuvzfGxaVg89s51g5yjx2EDxDzsy8vCcU5zycufj1ctO9Bc2twXy/chjQ4PMRexcU6mOnm3SX1RACkIZMzKBbFpd+E7OynUZI0w39fdF9JeLgfmgETjV8F/sHa59urUBy2nDsp/kaBXA4+ViX1vIYYVM7LFe0WKIzMf8Z2dX9b2MEZ9r4l/UkyQyhH9mO8GaSvVow+lDxUCsV+LA4GNPFOHukS/TWKp6frtc0kru8YHit2fvbNf5u9p1bFfxs61c4510vAxQ+pIG0Nn4HqfqZpt6uMdV/1TL2AtxJOaiXK0DFcf6C3dO7mrbthT5/7a/Fjd0F+N45v8CsRhmnj+iYEIAAAAASUVORK5CYII=" alt="Fenix"><div class="hdiv"></div><h1>Claims Editor</h1><button class="btn-sm toggle-all" id="toggleAll" onclick="toggleAll()">Expand all</button></div>
|
|
11
|
+
<div class="bdy">
|
|
12
|
+
<p class="sub">Open any claim to edit it. Add or remove claims as needed. Click Copy for Save and paste into chat.</p>
|
|
13
|
+
<div id="acc"></div>
|
|
14
|
+
<div class="addbar"><button class="btn-sm" onclick="addItem()">+ Add claim</button></div>
|
|
15
|
+
<div class="bar"><button class="cta" onclick="go()">Copy for Save</button><span id="st"></span></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="ftr"><span>Fenix Patent Assistant</span><span>v3</span></div>
|
|
18
|
+
</div>
|
|
19
|
+
<script>
|
|
20
|
+
var EDITOR_TYPE="claims";
|
|
21
|
+
var INITIAL_CONTENT="";
|
|
22
|
+
function parseInit(){ var d=INITIAL_CONTENT; if(typeof d==="string"){ var s=d.trim(); if(!s) return null; try{ d=JSON.parse(s); }catch(e){ return s; } } return d; }
|
|
23
|
+
function toItems(){
|
|
24
|
+
var d=parseInit();
|
|
25
|
+
if(EDITOR_TYPE==="claims"){
|
|
26
|
+
if(Array.isArray(d)){ return d.map(function(c){ return {number:String(c.claimNumber||c.number||""),text:Array.isArray(c.claimText)?c.claimText.join("\n"):(c.claimText||c.text||""),orig:c}; }); }
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
if(EDITOR_TYPE==="figures"){ return Array.isArray(d)?d:(d&&d.figures?d.figures:[]); }
|
|
30
|
+
if(EDITOR_TYPE==="sections"){ var arr=[]; if(d&&typeof d==="object"&&!Array.isArray(d)){ Object.keys(d).forEach(function(k){ var v=d[k]; var txt=v&&v.paragraphs?v.paragraphs.map(function(p){return String(p).replace(/<[^>]+>/g,"").trim();}).join("\n\n"):(typeof v==="string"?v:""); arr.push({name:k,text:txt}); }); } return arr; }
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
function elt(tag,cls,txt){ var e=document.createElement(tag); if(cls)e.className=cls; if(txt!=null)e.textContent=txt; return e; }
|
|
34
|
+
function makeAcc(headerTitle,badge,preview,bodyBuilder){
|
|
35
|
+
var wrap=elt("div","acc"); var hd=elt("div","acc-hd");
|
|
36
|
+
hd.appendChild(elt("span","chev","\u25B6")); hd.appendChild(elt("span","ttl",headerTitle));
|
|
37
|
+
if(badge!=null){ hd.appendChild(elt("span","badge",badge)); }
|
|
38
|
+
var prev=elt("span","prev",preview||""); hd.appendChild(prev);
|
|
39
|
+
var rm=elt("button","rm-item","Remove"); rm.onclick=function(ev){ ev.stopPropagation(); wrap.remove(); syncToggle(); }; hd.appendChild(rm);
|
|
40
|
+
hd.onclick=function(){ wrap.classList.toggle("open"); syncToggle(); };
|
|
41
|
+
var bd=elt("div","acc-bd"); bodyBuilder(bd,prev);
|
|
42
|
+
wrap.appendChild(hd); wrap.appendChild(bd); return wrap;
|
|
43
|
+
}
|
|
44
|
+
function claimBody(bd,prev,num,text){
|
|
45
|
+
var f1=elt("div","field"); f1.appendChild(elt("label",null,"Claim Number")); var ni=document.createElement("input"); ni.className="c-num"; ni.value=num||""; f1.appendChild(ni); bd.appendChild(f1);
|
|
46
|
+
var f2=elt("div","field"); f2.appendChild(elt("label",null,"Claim Text")); var ta=document.createElement("textarea"); ta.className="c-txt sec"; ta.value=text||""; ta.oninput=function(){ prev.textContent=(ta.value||"").slice(0,80); }; f2.appendChild(ta); bd.appendChild(f2);
|
|
47
|
+
}
|
|
48
|
+
function addClaim(num,text,orig){ var acc=document.getElementById("acc"); var w=makeAcc("Claim "+(num||"?"),null,(text||"").slice(0,80),function(bd,prev){ claimBody(bd,prev,num,text); }); w.__claim=orig||{}; acc.appendChild(w); return w; }
|
|
49
|
+
function figRow(tbody,num,label,txt){
|
|
50
|
+
var tr=document.createElement("tr");
|
|
51
|
+
var td0=document.createElement("td"); var i0=document.createElement("input"); i0.className="r-num"; i0.style.width="60px"; i0.value=num||""; td0.appendChild(i0); tr.appendChild(td0);
|
|
52
|
+
var td1=document.createElement("td"); var i1=document.createElement("input"); i1.className="r-lab"; i1.value=label||""; td1.appendChild(i1); tr.appendChild(td1);
|
|
53
|
+
var td2=document.createElement("td"); var i2=document.createElement("input"); i2.className="r-txt"; i2.value=txt||""; td2.appendChild(i2); tr.appendChild(td2);
|
|
54
|
+
var td3=document.createElement("td"); var b=document.createElement("button"); b.className="del-btn"; b.textContent="x"; b.onclick=function(){ tr.remove(); }; td3.appendChild(b); tr.appendChild(td3);
|
|
55
|
+
tbody.appendChild(tr);
|
|
56
|
+
}
|
|
57
|
+
function figBody(bd,prev,fig){
|
|
58
|
+
var r=elt("div","row2");
|
|
59
|
+
var c1=elt("div","field"); c1.appendChild(elt("label",null,"Figure Number")); var nn=document.createElement("input"); nn.className="f-num"; nn.value=fig.number||""; c1.appendChild(nn); r.appendChild(c1);
|
|
60
|
+
var c2=elt("div","field"); c2.appendChild(elt("label",null,"Type")); var sel=document.createElement("select"); sel.className="f-type"; ["Flowchart","Device","Placeholder"].forEach(function(o){ var op=document.createElement("option"); op.textContent=o; sel.appendChild(op); }); sel.value=fig.type||"Flowchart"; c2.appendChild(sel); r.appendChild(c2); bd.appendChild(r);
|
|
61
|
+
var fb=elt("div","field"); fb.appendChild(elt("label",null,"Brief Description")); var bi=document.createElement("input"); bi.className="f-brief"; bi.value=fig.briefDescription||""; bi.oninput=function(){ prev.textContent=(bi.value||"").slice(0,70); }; fb.appendChild(bi); bd.appendChild(fb);
|
|
62
|
+
var fi=elt("div","field"); fi.appendChild(elt("label",null,"Introductory Sentence")); var ii=document.createElement("input"); ii.className="f-intro"; ii.value=fig.introductory||""; fi.appendChild(ii); bd.appendChild(fi);
|
|
63
|
+
var lbl=elt("label",null,fig.type==="Device"?"Components":"Steps"); lbl.style.marginTop="6px"; bd.appendChild(lbl);
|
|
64
|
+
var tbl=document.createElement("table"); tbl.innerHTML="<thead><tr><th style='width:70px'>#</th><th style='width:170px'>Label</th><th>Description text</th><th style='width:34px'></th></tr></thead>"; var tbody=document.createElement("tbody"); tbl.appendChild(tbody); bd.appendChild(tbl);
|
|
65
|
+
var arr=(fig.type==="Device")?(fig.components||[]):(fig.steps||[]); arr.forEach(function(e){ figRow(tbody,e.number,e.label,e.text); });
|
|
66
|
+
var tb=elt("div","tbl-bar"); var ab=document.createElement("button"); ab.className="btn-sm"; ab.textContent="+ Add row"; ab.onclick=function(){ var rows=tbody.querySelectorAll("tr"); var last=rows.length?parseInt(rows[rows.length-1].querySelector(".r-num").value||"95"):95; figRow(tbody,String(last+5),"",""); }; tb.appendChild(ab); tb.appendChild(elt("span",null,"")); bd.appendChild(tb);
|
|
67
|
+
}
|
|
68
|
+
function addFigure(fig){ fig=fig||{number:"",type:"Flowchart",briefDescription:"",introductory:"",steps:[],components:[]}; var acc=document.getElementById("acc"); var w=makeAcc("FIG. "+(fig.number||"?"),fig.type||"Flowchart",(fig.briefDescription||"").slice(0,70),function(bd,prev){ figBody(bd,prev,fig); }); acc.appendChild(w); return w; }
|
|
69
|
+
function secBody(bd,prev,name,text){
|
|
70
|
+
var f1=elt("div","field"); f1.appendChild(elt("label",null,"Section Name")); var ni=document.createElement("input"); ni.className="s-name"; ni.value=name||""; f1.appendChild(ni); bd.appendChild(f1);
|
|
71
|
+
var f2=elt("div","field"); f2.appendChild(elt("label",null,"Text (blank line = new paragraph)")); var ta=document.createElement("textarea"); ta.className="s-txt sec"; ta.value=text||""; ta.oninput=function(){ prev.textContent=(ta.value||"").replace(/\n/g," ").slice(0,80); }; f2.appendChild(ta); bd.appendChild(f2);
|
|
72
|
+
}
|
|
73
|
+
function addSection(name,text){ var acc=document.getElementById("acc"); var w=makeAcc(name||"Section",null,(text||"").replace(/\n/g," ").slice(0,80),function(bd,prev){ secBody(bd,prev,name,text); }); acc.appendChild(w); return w; }
|
|
74
|
+
function addItem(){ if(EDITOR_TYPE==="claims"){ var rows=document.querySelectorAll("#acc .c-num"); var last=rows.length?parseInt(rows[rows.length-1].value||"0"):0; addClaim(String(last+1),"",{}).classList.add("open"); } else if(EDITOR_TYPE==="figures"){ addFigure(null).classList.add("open"); } else { addSection("New Section","").classList.add("open"); } syncToggle(); }
|
|
75
|
+
function syncToggle(){ var btn=document.getElementById("toggleAll"); if(!btn) return; var accs=document.querySelectorAll("#acc .acc"); if(!accs.length){ btn.style.display="none"; return; } btn.style.display=""; var anyClosed=Array.from(accs).some(function(a){ return !a.classList.contains("open"); }); btn.textContent=anyClosed?"Expand all":"Collapse all"; }
|
|
76
|
+
function toggleAll(){ var accs=document.querySelectorAll("#acc .acc"); var anyClosed=Array.from(accs).some(function(a){ return !a.classList.contains("open"); }); accs.forEach(function(a){ if(anyClosed){ a.classList.add("open"); } else { a.classList.remove("open"); } }); syncToggle(); }
|
|
77
|
+
window.onload=function(){ var items=toItems()||[]; if(EDITOR_TYPE==="claims"){ items.forEach(function(c){ addClaim(c.number,c.text,c.orig); }); } else if(EDITOR_TYPE==="figures"){ items.forEach(function(f){ addFigure(f); }); } else { items.forEach(function(s){ addSection(s.name,s.text); }); } syncToggle(); };
|
|
78
|
+
function collect(){
|
|
79
|
+
var accs=document.querySelectorAll("#acc .acc");
|
|
80
|
+
if(EDITOR_TYPE==="claims"){ var out=[]; accs.forEach(function(a){ var n=a.querySelector(".c-num").value.trim(); var t=a.querySelector(".c-txt").value; var orig=a.__claim||{}; if(n||t.trim()){ out.push({ claimNumber:n, claimStatus:orig.claimStatus||"original", claimType:orig.claimType||"", claimText:t.split(/\n/), parent:orig.parent||"", independentParent:orig.independentParent||"" }); } }); return "[EDITOR SUBMIT - claims]\n"+JSON.stringify(out,null,2); }
|
|
81
|
+
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),introductory:a.querySelector(".f-intro").value.trim(),steps:isDev?[]:rows,components:isDev?rows:[]}); }); return "[EDITOR SUBMIT - figures]\n"+JSON.stringify(figs,null,2); }
|
|
82
|
+
var secs={}; accs.forEach(function(a){ var nm=a.querySelector(".s-name").value.trim(); var tx=a.querySelector(".s-txt").value; if(nm){ var paras=tx.split(/\n\n+/).map(function(p){return p.trim();}).filter(Boolean).map(function(p){return "<p>"+p.replace(/\n/g," ")+"</p>";}); secs[nm]={paragraphs:paras}; } }); return "[EDITOR SUBMIT - sections]\n"+JSON.stringify(secs,null,2);
|
|
83
|
+
}
|
|
84
|
+
function go(){ var result=collect(); var done=function(){ document.getElementById("st").textContent="\u2713 Copied -- paste into chat."; }; if(navigator.clipboard){ navigator.clipboard.writeText(result).then(done).catch(fb); } else { fb(); } function fb(){ var el=document.createElement("textarea"); el.value=result; el.style.cssText="position:fixed;top:0;left:0;opacity:0;"; document.body.appendChild(el); el.select(); try{ document.execCommand("copy"); done(); }catch(e){ document.getElementById("st").textContent="Copy failed."; } document.body.removeChild(el); } }
|
|
85
|
+
</script>
|
|
86
|
+
</body>
|
|
87
|
+
</html>
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>Figures Editor</title>
|
|
6
|
+
<style>*{box-sizing:border-box;margin:0;padding:0}body{font-family:system-ui,-apple-system,sans-serif;background:#fff7ed;min-height:100vh;padding:20px 16px}.card{background:#fff;max-width:900px;margin:0 auto;border-radius:10px;box-shadow:0 1px 4px rgba(0,0,0,.12);overflow:hidden}.hdr{display:flex;align-items:center;gap:12px;padding:14px 20px;border-bottom:1px solid #fed7aa}.hdr img{height:26px;width:auto}.hdiv{width:1px;height:22px;background:#fed7aa;flex-shrink:0}.hdr h1{font-size:15px;font-weight:600;color:#1e293b}.hdr .toggle-all{margin-left:auto;flex-shrink:0}.bdy{padding:20px}.sub{font-size:13px;color:#64748b;margin-bottom:14px}input,select,textarea{font-family:inherit;font-size:13px;border:1.5px solid #fed7aa;border-radius:5px;padding:6px 10px;outline:none;width:100%;transition:border-color .15s;background:#fff}input:focus,select:focus,textarea:focus{border-color:#ea580c}.row2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}.field{margin-bottom:12px}label{display:block;font-size:12px;font-weight:600;color:#374151;margin-bottom:4px}.acc{border:1px solid #fed7aa;overflow:hidden;margin-bottom:-1px}.acc-hd{display:flex;align-items:center;gap:10px;padding:11px 14px;cursor:pointer;background:#fffbf5;user-select:none}.acc-hd:hover{background:#fff7ed}.acc-hd .chev{color:#ea580c;font-size:12px;transition:transform .15s;flex-shrink:0}.acc.open .chev{transform:rotate(90deg)}.acc-hd .ttl{font-weight:600;font-size:13px;color:#1e293b;flex-shrink:0}.acc-hd .prev{font-size:12px;color:#94a3b8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.acc-hd .badge{font-size:11px;font-weight:600;padding:1px 8px;border-radius:10px;background:#ffedd5;color:#c2410c;flex-shrink:0}.acc-bd{display:none;padding:14px;border-top:1px solid #fed7aa;background:#fff}.acc.open .acc-bd{display:block}table{width:100%;border-collapse:collapse;margin-top:8px}th,td{padding:6px 10px;border:1px solid #fed7aa;font-size:13px;text-align:left}th{background:#fff7ed;font-weight:600;color:#374151}td input{border:none;padding:0;width:100%;background:transparent}td input:focus{outline:1px solid #ea580c;border-radius:3px}.tbl-bar{display:flex;justify-content:space-between;align-items:center;margin-top:8px}.btn-sm{padding:4px 12px;background:#fff;border:1.5px solid #fed7aa;border-radius:5px;font-size:12px;cursor:pointer;color:#374151}.btn-sm:hover{border-color:#ea580c}.del-btn{color:#dc2626;background:none;border:none;cursor:pointer;font-size:16px;line-height:1;padding:0 4px}.rm-item{margin-left:auto;color:#dc2626;background:none;border:none;cursor:pointer;font-size:13px;flex-shrink:0}.bar{margin-top:16px;display:flex;align-items:center;gap:14px}.cta{padding:9px 24px;background:#ea580c;color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s}.cta:hover{background:#c2410c}#st{color:#16a34a;font-size:13px;font-weight:500}textarea.sec{min-height:200px;font-family:Menlo,Consolas,monospace;line-height:1.6;resize:vertical}.addbar{margin:6px 0 4px}.ftr{padding:9px 20px;border-top:1px solid #fed7aa;font-size:11px;color:#94a3b8;display:flex;justify-content:space-between}</style>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="card">
|
|
10
|
+
<div class="hdr"><img src="data:image/png;base64,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" alt="Fenix"><div class="hdiv"></div><h1>Figures Editor</h1><button class="btn-sm toggle-all" id="toggleAll" onclick="toggleAll()">Expand all</button></div>
|
|
11
|
+
<div class="bdy">
|
|
12
|
+
<p class="sub">Open any figure to edit its details and steps/components. Add or remove figures and rows as needed.</p>
|
|
13
|
+
<div id="acc"></div>
|
|
14
|
+
<div class="addbar"><button class="btn-sm" onclick="addItem()">+ Add figure</button></div>
|
|
15
|
+
<div class="bar"><button class="cta" onclick="go()">Copy for Save</button><span id="st"></span></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="ftr"><span>Fenix Patent Assistant</span><span>v3</span></div>
|
|
18
|
+
</div>
|
|
19
|
+
<script>
|
|
20
|
+
var EDITOR_TYPE="figures";
|
|
21
|
+
var INITIAL_CONTENT="";
|
|
22
|
+
function parseInit(){ var d=INITIAL_CONTENT; if(typeof d==="string"){ var s=d.trim(); if(!s) return null; try{ d=JSON.parse(s); }catch(e){ return s; } } return d; }
|
|
23
|
+
function toItems(){
|
|
24
|
+
var d=parseInit();
|
|
25
|
+
if(EDITOR_TYPE==="claims"){
|
|
26
|
+
if(Array.isArray(d)){ return d.map(function(c){ return {number:String(c.claimNumber||c.number||""),text:Array.isArray(c.claimText)?c.claimText.join("\n"):(c.claimText||c.text||""),orig:c}; }); }
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
if(EDITOR_TYPE==="figures"){ return Array.isArray(d)?d:(d&&d.figures?d.figures:[]); }
|
|
30
|
+
if(EDITOR_TYPE==="sections"){ var arr=[]; if(d&&typeof d==="object"&&!Array.isArray(d)){ Object.keys(d).forEach(function(k){ var v=d[k]; var txt=v&&v.paragraphs?v.paragraphs.map(function(p){return String(p).replace(/<[^>]+>/g,"").trim();}).join("\n\n"):(typeof v==="string"?v:""); arr.push({name:k,text:txt}); }); } return arr; }
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
function elt(tag,cls,txt){ var e=document.createElement(tag); if(cls)e.className=cls; if(txt!=null)e.textContent=txt; return e; }
|
|
34
|
+
function makeAcc(headerTitle,badge,preview,bodyBuilder){
|
|
35
|
+
var wrap=elt("div","acc"); var hd=elt("div","acc-hd");
|
|
36
|
+
hd.appendChild(elt("span","chev","\u25B6")); hd.appendChild(elt("span","ttl",headerTitle));
|
|
37
|
+
if(badge!=null){ hd.appendChild(elt("span","badge",badge)); }
|
|
38
|
+
var prev=elt("span","prev",preview||""); hd.appendChild(prev);
|
|
39
|
+
var rm=elt("button","rm-item","Remove"); rm.onclick=function(ev){ ev.stopPropagation(); wrap.remove(); syncToggle(); }; hd.appendChild(rm);
|
|
40
|
+
hd.onclick=function(){ wrap.classList.toggle("open"); syncToggle(); };
|
|
41
|
+
var bd=elt("div","acc-bd"); bodyBuilder(bd,prev);
|
|
42
|
+
wrap.appendChild(hd); wrap.appendChild(bd); return wrap;
|
|
43
|
+
}
|
|
44
|
+
function claimBody(bd,prev,num,text){
|
|
45
|
+
var f1=elt("div","field"); f1.appendChild(elt("label",null,"Claim Number")); var ni=document.createElement("input"); ni.className="c-num"; ni.value=num||""; f1.appendChild(ni); bd.appendChild(f1);
|
|
46
|
+
var f2=elt("div","field"); f2.appendChild(elt("label",null,"Claim Text")); var ta=document.createElement("textarea"); ta.className="c-txt sec"; ta.value=text||""; ta.oninput=function(){ prev.textContent=(ta.value||"").slice(0,80); }; f2.appendChild(ta); bd.appendChild(f2);
|
|
47
|
+
}
|
|
48
|
+
function addClaim(num,text,orig){ var acc=document.getElementById("acc"); var w=makeAcc("Claim "+(num||"?"),null,(text||"").slice(0,80),function(bd,prev){ claimBody(bd,prev,num,text); }); w.__claim=orig||{}; acc.appendChild(w); return w; }
|
|
49
|
+
function figRow(tbody,num,label,txt){
|
|
50
|
+
var tr=document.createElement("tr");
|
|
51
|
+
var td0=document.createElement("td"); var i0=document.createElement("input"); i0.className="r-num"; i0.style.width="60px"; i0.value=num||""; td0.appendChild(i0); tr.appendChild(td0);
|
|
52
|
+
var td1=document.createElement("td"); var i1=document.createElement("input"); i1.className="r-lab"; i1.value=label||""; td1.appendChild(i1); tr.appendChild(td1);
|
|
53
|
+
var td2=document.createElement("td"); var i2=document.createElement("input"); i2.className="r-txt"; i2.value=txt||""; td2.appendChild(i2); tr.appendChild(td2);
|
|
54
|
+
var td3=document.createElement("td"); var b=document.createElement("button"); b.className="del-btn"; b.textContent="x"; b.onclick=function(){ tr.remove(); }; td3.appendChild(b); tr.appendChild(td3);
|
|
55
|
+
tbody.appendChild(tr);
|
|
56
|
+
}
|
|
57
|
+
function figBody(bd,prev,fig){
|
|
58
|
+
var r=elt("div","row2");
|
|
59
|
+
var c1=elt("div","field"); c1.appendChild(elt("label",null,"Figure Number")); var nn=document.createElement("input"); nn.className="f-num"; nn.value=fig.number||""; c1.appendChild(nn); r.appendChild(c1);
|
|
60
|
+
var c2=elt("div","field"); c2.appendChild(elt("label",null,"Type")); var sel=document.createElement("select"); sel.className="f-type"; ["Flowchart","Device","Placeholder"].forEach(function(o){ var op=document.createElement("option"); op.textContent=o; sel.appendChild(op); }); sel.value=fig.type||"Flowchart"; c2.appendChild(sel); r.appendChild(c2); bd.appendChild(r);
|
|
61
|
+
var fb=elt("div","field"); fb.appendChild(elt("label",null,"Brief Description")); var bi=document.createElement("input"); bi.className="f-brief"; bi.value=fig.briefDescription||""; bi.oninput=function(){ prev.textContent=(bi.value||"").slice(0,70); }; fb.appendChild(bi); bd.appendChild(fb);
|
|
62
|
+
var fi=elt("div","field"); fi.appendChild(elt("label",null,"Introductory Sentence")); var ii=document.createElement("input"); ii.className="f-intro"; ii.value=fig.introductory||""; fi.appendChild(ii); bd.appendChild(fi);
|
|
63
|
+
var lbl=elt("label",null,fig.type==="Device"?"Components":"Steps"); lbl.style.marginTop="6px"; bd.appendChild(lbl);
|
|
64
|
+
var tbl=document.createElement("table"); tbl.innerHTML="<thead><tr><th style='width:70px'>#</th><th style='width:170px'>Label</th><th>Description text</th><th style='width:34px'></th></tr></thead>"; var tbody=document.createElement("tbody"); tbl.appendChild(tbody); bd.appendChild(tbl);
|
|
65
|
+
var arr=(fig.type==="Device")?(fig.components||[]):(fig.steps||[]); arr.forEach(function(e){ figRow(tbody,e.number,e.label,e.text); });
|
|
66
|
+
var tb=elt("div","tbl-bar"); var ab=document.createElement("button"); ab.className="btn-sm"; ab.textContent="+ Add row"; ab.onclick=function(){ var rows=tbody.querySelectorAll("tr"); var last=rows.length?parseInt(rows[rows.length-1].querySelector(".r-num").value||"95"):95; figRow(tbody,String(last+5),"",""); }; tb.appendChild(ab); tb.appendChild(elt("span",null,"")); bd.appendChild(tb);
|
|
67
|
+
}
|
|
68
|
+
function addFigure(fig){ fig=fig||{number:"",type:"Flowchart",briefDescription:"",introductory:"",steps:[],components:[]}; var acc=document.getElementById("acc"); var w=makeAcc("FIG. "+(fig.number||"?"),fig.type||"Flowchart",(fig.briefDescription||"").slice(0,70),function(bd,prev){ figBody(bd,prev,fig); }); acc.appendChild(w); return w; }
|
|
69
|
+
function secBody(bd,prev,name,text){
|
|
70
|
+
var f1=elt("div","field"); f1.appendChild(elt("label",null,"Section Name")); var ni=document.createElement("input"); ni.className="s-name"; ni.value=name||""; f1.appendChild(ni); bd.appendChild(f1);
|
|
71
|
+
var f2=elt("div","field"); f2.appendChild(elt("label",null,"Text (blank line = new paragraph)")); var ta=document.createElement("textarea"); ta.className="s-txt sec"; ta.value=text||""; ta.oninput=function(){ prev.textContent=(ta.value||"").replace(/\n/g," ").slice(0,80); }; f2.appendChild(ta); bd.appendChild(f2);
|
|
72
|
+
}
|
|
73
|
+
function addSection(name,text){ var acc=document.getElementById("acc"); var w=makeAcc(name||"Section",null,(text||"").replace(/\n/g," ").slice(0,80),function(bd,prev){ secBody(bd,prev,name,text); }); acc.appendChild(w); return w; }
|
|
74
|
+
function addItem(){ if(EDITOR_TYPE==="claims"){ var rows=document.querySelectorAll("#acc .c-num"); var last=rows.length?parseInt(rows[rows.length-1].value||"0"):0; addClaim(String(last+1),"",{}).classList.add("open"); } else if(EDITOR_TYPE==="figures"){ addFigure(null).classList.add("open"); } else { addSection("New Section","").classList.add("open"); } syncToggle(); }
|
|
75
|
+
function syncToggle(){ var btn=document.getElementById("toggleAll"); if(!btn) return; var accs=document.querySelectorAll("#acc .acc"); if(!accs.length){ btn.style.display="none"; return; } btn.style.display=""; var anyClosed=Array.from(accs).some(function(a){ return !a.classList.contains("open"); }); btn.textContent=anyClosed?"Expand all":"Collapse all"; }
|
|
76
|
+
function toggleAll(){ var accs=document.querySelectorAll("#acc .acc"); var anyClosed=Array.from(accs).some(function(a){ return !a.classList.contains("open"); }); accs.forEach(function(a){ if(anyClosed){ a.classList.add("open"); } else { a.classList.remove("open"); } }); syncToggle(); }
|
|
77
|
+
window.onload=function(){ var items=toItems()||[]; if(EDITOR_TYPE==="claims"){ items.forEach(function(c){ addClaim(c.number,c.text,c.orig); }); } else if(EDITOR_TYPE==="figures"){ items.forEach(function(f){ addFigure(f); }); } else { items.forEach(function(s){ addSection(s.name,s.text); }); } syncToggle(); };
|
|
78
|
+
function collect(){
|
|
79
|
+
var accs=document.querySelectorAll("#acc .acc");
|
|
80
|
+
if(EDITOR_TYPE==="claims"){ var out=[]; accs.forEach(function(a){ var n=a.querySelector(".c-num").value.trim(); var t=a.querySelector(".c-txt").value; var orig=a.__claim||{}; if(n||t.trim()){ out.push({ claimNumber:n, claimStatus:orig.claimStatus||"original", claimType:orig.claimType||"", claimText:t.split(/\n/), parent:orig.parent||"", independentParent:orig.independentParent||"" }); } }); return "[EDITOR SUBMIT - claims]\n"+JSON.stringify(out,null,2); }
|
|
81
|
+
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),introductory:a.querySelector(".f-intro").value.trim(),steps:isDev?[]:rows,components:isDev?rows:[]}); }); return "[EDITOR SUBMIT - figures]\n"+JSON.stringify(figs,null,2); }
|
|
82
|
+
var secs={}; accs.forEach(function(a){ var nm=a.querySelector(".s-name").value.trim(); var tx=a.querySelector(".s-txt").value; if(nm){ var paras=tx.split(/\n\n+/).map(function(p){return p.trim();}).filter(Boolean).map(function(p){return "<p>"+p.replace(/\n/g," ")+"</p>";}); secs[nm]={paragraphs:paras}; } }); return "[EDITOR SUBMIT - sections]\n"+JSON.stringify(secs,null,2);
|
|
83
|
+
}
|
|
84
|
+
function go(){ var result=collect(); var done=function(){ document.getElementById("st").textContent="\u2713 Copied -- paste into chat."; }; if(navigator.clipboard){ navigator.clipboard.writeText(result).then(done).catch(fb); } else { fb(); } function fb(){ var el=document.createElement("textarea"); el.value=result; el.style.cssText="position:fixed;top:0;left:0;opacity:0;"; document.body.appendChild(el); el.select(); try{ document.execCommand("copy"); done(); }catch(e){ document.getElementById("st").textContent="Copy failed."; } document.body.removeChild(el); } }
|
|
85
|
+
</script>
|
|
86
|
+
</body>
|
|
87
|
+
</html>
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>Spec Editor</title>
|
|
6
|
+
<style>*{box-sizing:border-box;margin:0;padding:0}body{font-family:system-ui,-apple-system,sans-serif;background:#fff7ed;min-height:100vh;padding:20px 16px}.card{background:#fff;max-width:900px;margin:0 auto;border-radius:10px;box-shadow:0 1px 4px rgba(0,0,0,.12);overflow:hidden}.hdr{display:flex;align-items:center;gap:12px;padding:14px 20px;border-bottom:1px solid #fed7aa}.hdr img{height:26px;width:auto}.hdiv{width:1px;height:22px;background:#fed7aa;flex-shrink:0}.hdr h1{font-size:15px;font-weight:600;color:#1e293b}.hdr .toggle-all{margin-left:auto;flex-shrink:0}.bdy{padding:20px}.sub{font-size:13px;color:#64748b;margin-bottom:14px}input,select,textarea{font-family:inherit;font-size:13px;border:1.5px solid #fed7aa;border-radius:5px;padding:6px 10px;outline:none;width:100%;transition:border-color .15s;background:#fff}input:focus,select:focus,textarea:focus{border-color:#ea580c}.row2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}.field{margin-bottom:12px}label{display:block;font-size:12px;font-weight:600;color:#374151;margin-bottom:4px}.acc{border:1px solid #fed7aa;overflow:hidden;margin-bottom:-1px}.acc-hd{display:flex;align-items:center;gap:10px;padding:11px 14px;cursor:pointer;background:#fffbf5;user-select:none}.acc-hd:hover{background:#fff7ed}.acc-hd .chev{color:#ea580c;font-size:12px;transition:transform .15s;flex-shrink:0}.acc.open .chev{transform:rotate(90deg)}.acc-hd .ttl{font-weight:600;font-size:13px;color:#1e293b;flex-shrink:0}.acc-hd .prev{font-size:12px;color:#94a3b8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.acc-hd .badge{font-size:11px;font-weight:600;padding:1px 8px;border-radius:10px;background:#ffedd5;color:#c2410c;flex-shrink:0}.acc-bd{display:none;padding:14px;border-top:1px solid #fed7aa;background:#fff}.acc.open .acc-bd{display:block}table{width:100%;border-collapse:collapse;margin-top:8px}th,td{padding:6px 10px;border:1px solid #fed7aa;font-size:13px;text-align:left}th{background:#fff7ed;font-weight:600;color:#374151}td input{border:none;padding:0;width:100%;background:transparent}td input:focus{outline:1px solid #ea580c;border-radius:3px}.tbl-bar{display:flex;justify-content:space-between;align-items:center;margin-top:8px}.btn-sm{padding:4px 12px;background:#fff;border:1.5px solid #fed7aa;border-radius:5px;font-size:12px;cursor:pointer;color:#374151}.btn-sm:hover{border-color:#ea580c}.del-btn{color:#dc2626;background:none;border:none;cursor:pointer;font-size:16px;line-height:1;padding:0 4px}.rm-item{margin-left:auto;color:#dc2626;background:none;border:none;cursor:pointer;font-size:13px;flex-shrink:0}.bar{margin-top:16px;display:flex;align-items:center;gap:14px}.cta{padding:9px 24px;background:#ea580c;color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s}.cta:hover{background:#c2410c}#st{color:#16a34a;font-size:13px;font-weight:500}textarea.sec{min-height:200px;font-family:Menlo,Consolas,monospace;line-height:1.6;resize:vertical}.addbar{margin:6px 0 4px}.ftr{padding:9px 20px;border-top:1px solid #fed7aa;font-size:11px;color:#94a3b8;display:flex;justify-content:space-between}</style>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="card">
|
|
10
|
+
<div class="hdr"><img src="data:image/png;base64,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" alt="Fenix"><div class="hdiv"></div><h1>Spec Editor</h1><button class="btn-sm toggle-all" id="toggleAll" onclick="toggleAll()">Expand all</button></div>
|
|
11
|
+
<div class="bdy">
|
|
12
|
+
<p class="sub">Open any section to edit it. Each figure description is its own section. Click Copy for Save and paste into chat.</p>
|
|
13
|
+
<div id="acc"></div>
|
|
14
|
+
<div class="addbar"><button class="btn-sm" onclick="addItem()">+ Add section</button></div>
|
|
15
|
+
<div class="bar"><button class="cta" onclick="go()">Copy for Save</button><span id="st"></span></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="ftr"><span>Fenix Patent Assistant</span><span>v3</span></div>
|
|
18
|
+
</div>
|
|
19
|
+
<script>
|
|
20
|
+
var EDITOR_TYPE="sections";
|
|
21
|
+
var INITIAL_CONTENT="";
|
|
22
|
+
function parseInit(){ var d=INITIAL_CONTENT; if(typeof d==="string"){ var s=d.trim(); if(!s) return null; try{ d=JSON.parse(s); }catch(e){ return s; } } return d; }
|
|
23
|
+
function toItems(){
|
|
24
|
+
var d=parseInit();
|
|
25
|
+
if(EDITOR_TYPE==="claims"){
|
|
26
|
+
if(Array.isArray(d)){ return d.map(function(c){ return {number:String(c.claimNumber||c.number||""),text:Array.isArray(c.claimText)?c.claimText.join("\n"):(c.claimText||c.text||""),orig:c}; }); }
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
if(EDITOR_TYPE==="figures"){ return Array.isArray(d)?d:(d&&d.figures?d.figures:[]); }
|
|
30
|
+
if(EDITOR_TYPE==="sections"){ var arr=[]; if(d&&typeof d==="object"&&!Array.isArray(d)){ Object.keys(d).forEach(function(k){ var v=d[k]; var txt=v&&v.paragraphs?v.paragraphs.map(function(p){return String(p).replace(/<[^>]+>/g,"").trim();}).join("\n\n"):(typeof v==="string"?v:""); arr.push({name:k,text:txt}); }); } return arr; }
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
function elt(tag,cls,txt){ var e=document.createElement(tag); if(cls)e.className=cls; if(txt!=null)e.textContent=txt; return e; }
|
|
34
|
+
function makeAcc(headerTitle,badge,preview,bodyBuilder){
|
|
35
|
+
var wrap=elt("div","acc"); var hd=elt("div","acc-hd");
|
|
36
|
+
hd.appendChild(elt("span","chev","\u25B6")); hd.appendChild(elt("span","ttl",headerTitle));
|
|
37
|
+
if(badge!=null){ hd.appendChild(elt("span","badge",badge)); }
|
|
38
|
+
var prev=elt("span","prev",preview||""); hd.appendChild(prev);
|
|
39
|
+
var rm=elt("button","rm-item","Remove"); rm.onclick=function(ev){ ev.stopPropagation(); wrap.remove(); syncToggle(); }; hd.appendChild(rm);
|
|
40
|
+
hd.onclick=function(){ wrap.classList.toggle("open"); syncToggle(); };
|
|
41
|
+
var bd=elt("div","acc-bd"); bodyBuilder(bd,prev);
|
|
42
|
+
wrap.appendChild(hd); wrap.appendChild(bd); return wrap;
|
|
43
|
+
}
|
|
44
|
+
function claimBody(bd,prev,num,text){
|
|
45
|
+
var f1=elt("div","field"); f1.appendChild(elt("label",null,"Claim Number")); var ni=document.createElement("input"); ni.className="c-num"; ni.value=num||""; f1.appendChild(ni); bd.appendChild(f1);
|
|
46
|
+
var f2=elt("div","field"); f2.appendChild(elt("label",null,"Claim Text")); var ta=document.createElement("textarea"); ta.className="c-txt sec"; ta.value=text||""; ta.oninput=function(){ prev.textContent=(ta.value||"").slice(0,80); }; f2.appendChild(ta); bd.appendChild(f2);
|
|
47
|
+
}
|
|
48
|
+
function addClaim(num,text,orig){ var acc=document.getElementById("acc"); var w=makeAcc("Claim "+(num||"?"),null,(text||"").slice(0,80),function(bd,prev){ claimBody(bd,prev,num,text); }); w.__claim=orig||{}; acc.appendChild(w); return w; }
|
|
49
|
+
function figRow(tbody,num,label,txt){
|
|
50
|
+
var tr=document.createElement("tr");
|
|
51
|
+
var td0=document.createElement("td"); var i0=document.createElement("input"); i0.className="r-num"; i0.style.width="60px"; i0.value=num||""; td0.appendChild(i0); tr.appendChild(td0);
|
|
52
|
+
var td1=document.createElement("td"); var i1=document.createElement("input"); i1.className="r-lab"; i1.value=label||""; td1.appendChild(i1); tr.appendChild(td1);
|
|
53
|
+
var td2=document.createElement("td"); var i2=document.createElement("input"); i2.className="r-txt"; i2.value=txt||""; td2.appendChild(i2); tr.appendChild(td2);
|
|
54
|
+
var td3=document.createElement("td"); var b=document.createElement("button"); b.className="del-btn"; b.textContent="x"; b.onclick=function(){ tr.remove(); }; td3.appendChild(b); tr.appendChild(td3);
|
|
55
|
+
tbody.appendChild(tr);
|
|
56
|
+
}
|
|
57
|
+
function figBody(bd,prev,fig){
|
|
58
|
+
var r=elt("div","row2");
|
|
59
|
+
var c1=elt("div","field"); c1.appendChild(elt("label",null,"Figure Number")); var nn=document.createElement("input"); nn.className="f-num"; nn.value=fig.number||""; c1.appendChild(nn); r.appendChild(c1);
|
|
60
|
+
var c2=elt("div","field"); c2.appendChild(elt("label",null,"Type")); var sel=document.createElement("select"); sel.className="f-type"; ["Flowchart","Device","Placeholder"].forEach(function(o){ var op=document.createElement("option"); op.textContent=o; sel.appendChild(op); }); sel.value=fig.type||"Flowchart"; c2.appendChild(sel); r.appendChild(c2); bd.appendChild(r);
|
|
61
|
+
var fb=elt("div","field"); fb.appendChild(elt("label",null,"Brief Description")); var bi=document.createElement("input"); bi.className="f-brief"; bi.value=fig.briefDescription||""; bi.oninput=function(){ prev.textContent=(bi.value||"").slice(0,70); }; fb.appendChild(bi); bd.appendChild(fb);
|
|
62
|
+
var fi=elt("div","field"); fi.appendChild(elt("label",null,"Introductory Sentence")); var ii=document.createElement("input"); ii.className="f-intro"; ii.value=fig.introductory||""; fi.appendChild(ii); bd.appendChild(fi);
|
|
63
|
+
var lbl=elt("label",null,fig.type==="Device"?"Components":"Steps"); lbl.style.marginTop="6px"; bd.appendChild(lbl);
|
|
64
|
+
var tbl=document.createElement("table"); tbl.innerHTML="<thead><tr><th style='width:70px'>#</th><th style='width:170px'>Label</th><th>Description text</th><th style='width:34px'></th></tr></thead>"; var tbody=document.createElement("tbody"); tbl.appendChild(tbody); bd.appendChild(tbl);
|
|
65
|
+
var arr=(fig.type==="Device")?(fig.components||[]):(fig.steps||[]); arr.forEach(function(e){ figRow(tbody,e.number,e.label,e.text); });
|
|
66
|
+
var tb=elt("div","tbl-bar"); var ab=document.createElement("button"); ab.className="btn-sm"; ab.textContent="+ Add row"; ab.onclick=function(){ var rows=tbody.querySelectorAll("tr"); var last=rows.length?parseInt(rows[rows.length-1].querySelector(".r-num").value||"95"):95; figRow(tbody,String(last+5),"",""); }; tb.appendChild(ab); tb.appendChild(elt("span",null,"")); bd.appendChild(tb);
|
|
67
|
+
}
|
|
68
|
+
function addFigure(fig){ fig=fig||{number:"",type:"Flowchart",briefDescription:"",introductory:"",steps:[],components:[]}; var acc=document.getElementById("acc"); var w=makeAcc("FIG. "+(fig.number||"?"),fig.type||"Flowchart",(fig.briefDescription||"").slice(0,70),function(bd,prev){ figBody(bd,prev,fig); }); acc.appendChild(w); return w; }
|
|
69
|
+
function secBody(bd,prev,name,text){
|
|
70
|
+
var f1=elt("div","field"); f1.appendChild(elt("label",null,"Section Name")); var ni=document.createElement("input"); ni.className="s-name"; ni.value=name||""; f1.appendChild(ni); bd.appendChild(f1);
|
|
71
|
+
var f2=elt("div","field"); f2.appendChild(elt("label",null,"Text (blank line = new paragraph)")); var ta=document.createElement("textarea"); ta.className="s-txt sec"; ta.value=text||""; ta.oninput=function(){ prev.textContent=(ta.value||"").replace(/\n/g," ").slice(0,80); }; f2.appendChild(ta); bd.appendChild(f2);
|
|
72
|
+
}
|
|
73
|
+
function addSection(name,text){ var acc=document.getElementById("acc"); var w=makeAcc(name||"Section",null,(text||"").replace(/\n/g," ").slice(0,80),function(bd,prev){ secBody(bd,prev,name,text); }); acc.appendChild(w); return w; }
|
|
74
|
+
function addItem(){ if(EDITOR_TYPE==="claims"){ var rows=document.querySelectorAll("#acc .c-num"); var last=rows.length?parseInt(rows[rows.length-1].value||"0"):0; addClaim(String(last+1),"",{}).classList.add("open"); } else if(EDITOR_TYPE==="figures"){ addFigure(null).classList.add("open"); } else { addSection("New Section","").classList.add("open"); } syncToggle(); }
|
|
75
|
+
function syncToggle(){ var btn=document.getElementById("toggleAll"); if(!btn) return; var accs=document.querySelectorAll("#acc .acc"); if(!accs.length){ btn.style.display="none"; return; } btn.style.display=""; var anyClosed=Array.from(accs).some(function(a){ return !a.classList.contains("open"); }); btn.textContent=anyClosed?"Expand all":"Collapse all"; }
|
|
76
|
+
function toggleAll(){ var accs=document.querySelectorAll("#acc .acc"); var anyClosed=Array.from(accs).some(function(a){ return !a.classList.contains("open"); }); accs.forEach(function(a){ if(anyClosed){ a.classList.add("open"); } else { a.classList.remove("open"); } }); syncToggle(); }
|
|
77
|
+
window.onload=function(){ var items=toItems()||[]; if(EDITOR_TYPE==="claims"){ items.forEach(function(c){ addClaim(c.number,c.text,c.orig); }); } else if(EDITOR_TYPE==="figures"){ items.forEach(function(f){ addFigure(f); }); } else { items.forEach(function(s){ addSection(s.name,s.text); }); } syncToggle(); };
|
|
78
|
+
function collect(){
|
|
79
|
+
var accs=document.querySelectorAll("#acc .acc");
|
|
80
|
+
if(EDITOR_TYPE==="claims"){ var out=[]; accs.forEach(function(a){ var n=a.querySelector(".c-num").value.trim(); var t=a.querySelector(".c-txt").value; var orig=a.__claim||{}; if(n||t.trim()){ out.push({ claimNumber:n, claimStatus:orig.claimStatus||"original", claimType:orig.claimType||"", claimText:t.split(/\n/), parent:orig.parent||"", independentParent:orig.independentParent||"" }); } }); return "[EDITOR SUBMIT - claims]\n"+JSON.stringify(out,null,2); }
|
|
81
|
+
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),introductory:a.querySelector(".f-intro").value.trim(),steps:isDev?[]:rows,components:isDev?rows:[]}); }); return "[EDITOR SUBMIT - figures]\n"+JSON.stringify(figs,null,2); }
|
|
82
|
+
var secs={}; accs.forEach(function(a){ var nm=a.querySelector(".s-name").value.trim(); var tx=a.querySelector(".s-txt").value; if(nm){ var paras=tx.split(/\n\n+/).map(function(p){return p.trim();}).filter(Boolean).map(function(p){return "<p>"+p.replace(/\n/g," ")+"</p>";}); secs[nm]={paragraphs:paras}; } }); return "[EDITOR SUBMIT - sections]\n"+JSON.stringify(secs,null,2);
|
|
83
|
+
}
|
|
84
|
+
function go(){ var result=collect(); var done=function(){ document.getElementById("st").textContent="\u2713 Copied -- paste into chat."; }; if(navigator.clipboard){ navigator.clipboard.writeText(result).then(done).catch(fb); } else { fb(); } function fb(){ var el=document.createElement("textarea"); el.value=result; el.style.cssText="position:fixed;top:0;left:0;opacity:0;"; document.body.appendChild(el); el.select(); try{ document.execCommand("copy"); done(); }catch(e){ document.getElementById("st").textContent="Copy failed."; } document.body.removeChild(el); } }
|
|
85
|
+
</script>
|
|
86
|
+
</body>
|
|
87
|
+
</html>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Claims Workflow
|
|
2
|
+
|
|
3
|
+
**Version: 11**
|
|
4
|
+
|
|
5
|
+
## Before drafting
|
|
6
|
+
Read `references/patent-safe.md` for language guidelines.
|
|
7
|
+
|
|
8
|
+
## One claim at a time
|
|
9
|
+
(a) Draft -> (b) show -> ask "Does Claim N look right?" -- **END TURN** -> (c) after reply: revise or move to next
|
|
10
|
+
|
|
11
|
+
## Order
|
|
12
|
+
First independent -> its dependents -> next independent -> its dependents
|
|
13
|
+
|
|
14
|
+
## Claims schema (Fenix format)
|
|
15
|
+
Claims flow through the system **parsed**, as an array of claim objects -- not raw text. Each object:
|
|
16
|
+
`{ claimNumber: string, claimStatus: string, claimType: "independent"|"dependent", claimText: string[], parent: string, independentParent: string }`
|
|
17
|
+
- `claimText` is an array of lines (one entry per line of the claim body).
|
|
18
|
+
- `parent` is the claim number this claim depends on ("" for an independent claim); `independentParent` is the independent ancestor it ultimately traces to.
|
|
19
|
+
Parse claims into this schema yourself with `scripts/parse_claims.py` (pipe the text in, or `--file claims.txt --pretty`). Keep the claims in this parsed form from drafting through save -- do not flatten back to raw text. Holding the schema also lets you make structural edits directly (renumber, relink a dependent, etc.).
|
|
20
|
+
|
|
21
|
+
## Editor (accordion)
|
|
22
|
+
**Always ask the user whether they want to open the claims editor to review/edit the full set** before (or instead of) the one-at-a-time pass -- e.g. "Want me to open the claims editor so you can review them all at once?" Only open it if they say yes. To open it, open `assets/claims_editor.html`. Pre-fill `INITIAL_CONTENT` with the **parsed schema array** -- e.g. `INITIAL_CONTENT = [{"claimNumber":"1","claimStatus":"original","claimType":"independent","claimText":["A system comprising:","a processor; and","a memory."],"parent":"","independentParent":""}, ...]`. The editor shows every claim as a collapsible accordion item (open any claim to edit its number/text, add or remove claims) and **keeps the claims parsed**: on Copy it emits `[EDITOR SUBMIT - claims]` followed by a JSON array of schema objects. Strip the prefix and pass that array straight to save.
|
|
23
|
+
|
|
24
|
+
## Save (parsed array -- preferred)
|
|
25
|
+
Call `save_project({ type: "claims", claims: [...] })` with the parsed schema array (from your parse or from the editor). The server persists the array and derives the claim tree the spec generator needs, then returns `parsedClaims` (the normalized array, with `claimType`/`parent`/`independentParent` re-derived server-side) and `treeBuilt: true`. You do not need to re-verify a structured save.
|
|
26
|
+
|
|
27
|
+
## Save (raw text -- fallback)
|
|
28
|
+
If you only have raw claim text, call `save_project({ type: "claims", rawClaims })`. The server parses it and returns `parsedClaims` plus a `parseVerification` object. Always check `parseVerification.ok`:
|
|
29
|
+
- `ok` true: clean parse. Done.
|
|
30
|
+
- `ok` false: inspect `gaps` (missing numbers), `suspectedMerges` (a claim body starting with "N." -- a missed boundary), and `countMatches`. Re-parse the claims yourself into the schema array and re-submit via the parsed-array path above (NOT raw text). Common cause: a claim number not followed by a period (e.g. "4 A system" instead of "4. A system") merges two claims -- split them.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Disclosure Interview
|
|
2
|
+
|
|
3
|
+
**Version: 2**
|
|
4
|
+
|
|
5
|
+
## Default approach
|
|
6
|
+
|
|
7
|
+
When the user wants to capture an invention disclosure, **start by asking for the disclosure document rather than conducting an interview**:
|
|
8
|
+
|
|
9
|
+
1. Ask the user to upload their disclosure document (Word doc, PDF, or text).
|
|
10
|
+
2. If working in a Cowork session with a project folder connected, check the folder for an existing disclosure document.
|
|
11
|
+
3. Parse the uploaded/found document to extract: technical field, problem, inventive concept, method steps, system components, variations, examples, and prior art.
|
|
12
|
+
4. Summarize what was extracted and ask the user to confirm or correct it.
|
|
13
|
+
5. Save to the project: `save_project({ name, disclosure: structuredObject })`
|
|
14
|
+
|
|
15
|
+
## Disclosure interview (only if explicitly requested)
|
|
16
|
+
|
|
17
|
+
Only conduct a structured chat interview if the user says something like:
|
|
18
|
+
- 'Run a disclosure interview'
|
|
19
|
+
- 'Walk me through the disclosure questions'
|
|
20
|
+
- 'I want to answer questions about my invention'
|
|
21
|
+
- 'I do not have a document, interview me'
|
|
22
|
+
|
|
23
|
+
In that case, ask questions in this order (one at a time, wait for each answer):
|
|
24
|
+
1. What is the technical field of the invention?
|
|
25
|
+
2. What problem does it solve?
|
|
26
|
+
3. What is the core inventive concept?
|
|
27
|
+
4. Walk me through the method steps (what happens first, then what, etc.)?
|
|
28
|
+
5. What are the key system components?
|
|
29
|
+
6. Are there important variations or alternative embodiments?
|
|
30
|
+
7. Do you have examples or experimental results?
|
|
31
|
+
8. What prior art are you aware of?
|
|
32
|
+
|
|
33
|
+
After all answers: summarize, confirm with user, then `save_project({ name, disclosure: structuredObject })`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Editors — how to drive them
|
|
2
|
+
|
|
3
|
+
**Version: 11**
|
|
4
|
+
|
|
5
|
+
This skill ships three accordion HTML editors in `assets/`. **You never need to open or read the editor HTML** — everything you need to pre-fill and read them back is below.
|
|
6
|
+
|
|
7
|
+
## Open an editor with pre-filled data
|
|
8
|
+
1. Take the editor file (`assets/<editor>.html`) as-is — do not parse it.
|
|
9
|
+
2. Replace the line `var INITIAL_CONTENT="";` with `var INITIAL_CONTENT=<JSON>;`, where `<JSON>` is the data for that editor in the shape below (a JSON string the editor will `JSON.parse`, or an inlined array/object — both work).
|
|
10
|
+
3. Save the working copy and open it for the user.
|
|
11
|
+
|
|
12
|
+
The header has an **Expand all / Collapse all** toggle; each row has **Remove**; there is an **+ Add** button. The user clicks **Copy for Save**, which copies a clipboard payload prefixed with `[EDITOR SUBMIT - <type>]`. The user pastes it back into chat; you strip the prefix line and call `save_project`.
|
|
13
|
+
|
|
14
|
+
## claims_editor.html
|
|
15
|
+
INITIAL_CONTENT = array of claim objects in the Fenix schema:
|
|
16
|
+
```
|
|
17
|
+
[
|
|
18
|
+
{ "claimNumber": "1", "claimStatus": "original", "claimType": "independent",
|
|
19
|
+
"claimText": ["A system comprising:", "a processor; and", "a memory."],
|
|
20
|
+
"parent": "", "independentParent": "" },
|
|
21
|
+
{ "claimNumber": "2", "claimStatus": "original", "claimType": "dependent",
|
|
22
|
+
"claimText": ["The system of claim 1, wherein the processor is multi-core."],
|
|
23
|
+
"parent": "1", "independentParent": "1" }
|
|
24
|
+
]
|
|
25
|
+
```
|
|
26
|
+
- `claimText` is an array of lines (one entry per line of the claim body).
|
|
27
|
+
Output: `[EDITOR SUBMIT - claims]` then a JSON array of the same schema. Strip the prefix; call `save_project({ type: "claims", claims: [...] })`.
|
|
28
|
+
|
|
29
|
+
## figures_editor.html
|
|
30
|
+
INITIAL_CONTENT = array of figure objects:
|
|
31
|
+
```
|
|
32
|
+
[
|
|
33
|
+
{ "number": "1", "type": "Flowchart", "briefDescription": "...", "introductory": "...",
|
|
34
|
+
"steps": [ { "number": "100", "label": "receive", "text": "receiving a request" } ], "components": [] },
|
|
35
|
+
{ "number": "2", "type": "Device", "briefDescription": "...", "introductory": "...",
|
|
36
|
+
"steps": [], "components": [ { "number": "200", "label": "processor", "text": "a processor" } ] }
|
|
37
|
+
]
|
|
38
|
+
```
|
|
39
|
+
- `type` is "Flowchart" | "Device" | "Placeholder".
|
|
40
|
+
- Flowchart figures use `steps`; Device figures use `components`. Each row is `{ number, label, text }`.
|
|
41
|
+
Output: `[EDITOR SUBMIT - figures]` then a JSON array of figure objects. Strip the prefix; call `save_project({ type: "figures", figures: [...] })`.
|
|
42
|
+
|
|
43
|
+
## spec_editor.html
|
|
44
|
+
INITIAL_CONTENT = a sections object: key = section name, value = `{ "paragraphs": string[] }`. Each figure description is its own section (e.g. "FIG. 1").
|
|
45
|
+
```
|
|
46
|
+
{
|
|
47
|
+
"Field of the Invention": { "paragraphs": ["<p>The present disclosure relates to ...</p>"] },
|
|
48
|
+
"FIG. 1": { "paragraphs": ["<p>FIG. 1 illustrates ...</p>", "<p>In block 100, ...</p>"] }
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
- In the editor, a blank line separates paragraphs; on submit each paragraph is wrapped in `<p>...</p>`.
|
|
52
|
+
Output: `[EDITOR SUBMIT - sections]` then a JSON sections object. Strip the prefix; call `save_project({ type: "sections", sections: {...} })`.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Figure Description Protocol
|
|
2
|
+
|
|
3
|
+
**Version: 11**
|
|
4
|
+
|
|
5
|
+
You are a patent drafting assistant. Your task is to write a detailed textual description of a figure (e.g., FIG. 1) for inclusion in the Detailed Description section of a patent application.
|
|
6
|
+
|
|
7
|
+
INPUTS:
|
|
8
|
+
DISCLOSURE: Full technical disclosure of the invention.
|
|
9
|
+
CLAIMS: The claim set for the invention.
|
|
10
|
+
FIGURE LIST: A list of figures with short summaries.
|
|
11
|
+
FIGURE NUMBER: The specific figure to describe (e.g., FIG. 1).
|
|
12
|
+
FIGURE DESCRIPTION: A one-sentence summary of what the figure shows (e.g., "an image processing system).
|
|
13
|
+
CURRENT FIGURE DESCRIPTION: The existing figure description for this figure (if any).
|
|
14
|
+
|
|
15
|
+
Instructions:
|
|
16
|
+
Follow user instructions first, if provided; otherwise, follow the default section behavior and structure.
|
|
17
|
+
If the user provides additional directions or instructions (e.g., tone, style, or structure), incorporate them appropriately while maintaining clarity and consistency.
|
|
18
|
+
If the input includes an existing figure description, consider what refinements or additions, if any, are appropriate.
|
|
19
|
+
The existing figure description may include algorithmically generated text that closely mirrors the claim language or an algorithmically generated first sentence. Do not modify these sentences (even if they contradict the instructions below) unless 1. the user explicitly requests otherwise, 2. the sentence is obviously missing text (e.g., "The receiving component 110 may ."), OR 3. component numbering needs to be added to components (in which case the only change should be to add the component numbering). For situations 2 and 3, please add the missing text and component numbers even without user prompting. You may add additional sentences or paragraphs between these sentences to further describe components.
|
|
20
|
+
The overall goal of the figure description is to enable the claims related to the system or process depicted in the figure, provide clarity of the scope of terms used in the claims related to the figure, and provide fallback positions for claim amendments to claims related to the figure. However, you should be generating a description based on the subject matter of the claims and not directly referencing the claims themselves (e.g., Do not say "Claim 4 says" or "Claim 2 refers to").
|
|
21
|
+
|
|
22
|
+
Format:
|
|
23
|
+
Begin with an introductory paragraph starting with the sentence: "FIG. [#] illustrates [FIGURE DESCRIPTION]." unless an introductory sentence is already present (e.g., "Figure 1 shows a [block diagram/flowchart] of an example [process/device]."). The introductory paragraph should list the components, including component numbers.
|
|
24
|
+
Use formal language and neutral tone throughout.
|
|
25
|
+
Write this content for the Detailed Description section—not for the figure caption.
|
|
26
|
+
|
|
27
|
+
Element-by-Element Structure:
|
|
28
|
+
Write at least one paragraph per labeled element listed in the figure description.
|
|
29
|
+
|
|
30
|
+
Each subsequent paragraph must:
|
|
31
|
+
Introduce a component by name and reference number.
|
|
32
|
+
Define the component within the context of the figure and overall system.
|
|
33
|
+
Describe one or more operations the component performs.
|
|
34
|
+
Reference at least one other component and its reference number to explain relationships or interactions.
|
|
35
|
+
|
|
36
|
+
Numbering and Consistency:
|
|
37
|
+
|
|
38
|
+
Always reference components using both name and number, e.g., "user device 110".
|
|
39
|
+
Do not use shorthand like "device 110" or "the user" alone.
|
|
40
|
+
Please be sure that all components include their full name and number. If the existing figure description is present, you can use it to determine what components are present and what their names and numbers are.
|
|
41
|
+
|
|
42
|
+
Language Guidelines:
|
|
43
|
+
Use present tense (e.g., "user device 110 communicates with server 115…").
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
Restricted Terms - Avoid the Following:
|
|
47
|
+
Do not use:
|
|
48
|
+
Requirement or necessity language: require, must, necessary, need, have to, demand, essential
|
|
49
|
+
Evaluative language: improve, better, best, optimal, desirable, advantage, benefit, weakness, strength, preferred, ideal
|
|
50
|
+
Subjective claims or opinions: great, easy, efficient, important, always, never, completely, totally
|
|
51
|
+
Patent profanity or limiting statements: invention, inventive, proposed, patent, we, our, us, typically, generally, usually, some methods, current, conventional, traditional, legacy, suppose, allow, common
|
|
52
|
+
Overbroad determiners: it, they, their, all, every, none
|
|
53
|
+
|
|
54
|
+
Describe the components and what they do in the figure as well as their significance for the invention.
|
|
55
|
+
|
|
56
|
+
Output Format:
|
|
57
|
+
FIG. 1 illustrates an image processing system 100 including a user 105, user device 110, server 115, database 120, and cloud 125. The user 105 may provide an input such as input image or an input prompt to the system 100 via user device 110 connected to cloud 125. The server 115 may then cause a machine learning model (e.g., an image generation model) to generate a synthetic image based on the input provided by the user 105. In some cases the user 105 or the server 115 accesses database 120 to obtain configuration information or reference data for generating the synthetic image.
|
|
58
|
+
|
|
59
|
+
User 105 represents an operator who interacts with the system 100 through user device 110. In some scenarios, user 105 may initiate requests for image processing operations or submit visual data via user device 110 for processing.
|
|
60
|
+
|
|
61
|
+
User device 110 is a computing device through which user 105 interfaces with system 100. User device 110 communicates with server 115 over a network to submit requests and receive processed data. In some examples, user device 110 may also upload data to cloud 125 for storage or processing.
|
|
62
|
+
|
|
63
|
+
Server 115 receives and processes data from user device 110. Server 115 may execute one or more processing models on the received data and retrieve relevant records from database 120 to support such processing. Server 115 may also manage coordination between local processing and cloud-based resources such as cloud 125.
|
|
64
|
+
|
|
65
|
+
Database 120 stores structured or unstructured data used by server 115 to carry out image analysis tasks. For example, database 120 may store reference image data or model parameters that server 115 accesses during processing operations.
|
|
66
|
+
|
|
67
|
+
Cloud 125 represents a remote computing environment accessible by both server 115 and user device 110. In some cases, cloud 125 hosts additional storage or machine learning models used for image enhancement or recognition tasks initiated by user 105.
|