i-plane 2.1.0 → 2.1.1

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.
@@ -1,2 +1,2 @@
1
- import{A as we,B as K,C as Se,D as Ce,E as te,G as re,H as ne,L as S,l as ge,n as j,o as U,p as B,x as ue,y as pe,z as he}from"./cli-6zgwwatf.js";import{O as Ee,T as d}from"./cli-sw04mw2d.js";import{ba as w,ca as _,da as N}from"./cli-76dfafab.js";import{ga as We,ha as Me,la as I,na as b,oa as R}from"./cli-3t21mat0.js";var fe=Me(function(it,de){var J=!0,ce=!1,le=!1;de.exports=function(e,t){if(t)J=!t.enabled,ce=!!t.label,le=!!t.labelAfter;e.core.ruler.after("inline","github-task-lists",function(n){var r=n.tokens;for(var i=2;i<r.length;i++)if(Be(r,i))De(r[i],n.Token),se(r[i-2],"class","task-list-item"+(!J?" enabled":"")),se(r[Ne(r,i-2)],"class","contains-task-list")})};function se(e,t,n){var r=e.attrIndex(t),i=[t,n];if(r<0)e.attrPush(i);else e.attrs[r]=i}function Ne(e,t){var n=e[t].level-1;for(var r=t-1;r>=0;r--)if(e[r].level===n)return r;return-1}function Be(e,t){return Ie(e[t])&&Ue(e[t-1])&&_e(e[t-2])&&He(e[t])}function De(e,t){if(e.children.unshift(je(e,t)),e.children[1].content=e.children[1].content.slice(3),e.content=e.content.slice(3),ce)if(le){e.children.pop();var n="task-item-"+Math.ceil(Math.random()*1e7-1000);e.children[0].content=e.children[0].content.slice(0,-1)+' id="'+n+'">',e.children.push(Fe(e.content,n,t))}else e.children.unshift(Oe(t)),e.children.push(qe(t))}function je(e,t){var n=new t("html_inline","",0),r=J?' disabled="" ':"";if(e.content.indexOf("[ ] ")===0)n.content='<input class="task-list-item-checkbox"'+r+'type="checkbox">';else if(e.content.indexOf("[x] ")===0||e.content.indexOf("[X] ")===0)n.content='<input class="task-list-item-checkbox" checked=""'+r+'type="checkbox">';return n}function Oe(e){var t=new e("html_inline","",0);return t.content="<label>",t}function qe(e){var t=new e("html_inline","",0);return t.content="</label>",t}function Fe(e,t,n){var r=new n("html_inline","",0);return r.content='<label class="task-list-item-label" for="'+t+'">'+e+"</label>",r.attrs=[{for:t}],r}function Ie(e){return e.type==="inline"}function Ue(e){return e.type==="paragraph_open"}function _e(e){return e.type==="list_item_open"}function He(e){return e.content.indexOf("[ ] ")===0||e.content.indexOf("[x] ")===0||e.content.indexOf("[X] ")===0}});import{readFile as rt}from"node:fs/promises";import{createHash as ze,randomUUID as Je}from"node:crypto";var ke=We(fe(),1);import*as g from"yjs";var T=(e)=>{let t=new Set,n=(r)=>{if(!(r instanceof g.XmlElement))return;if(r.nodeName.toLowerCase()==="knowledgereview")t.add("knowledgeReview");for(let i of r.toArray())n(i)};return e.forEach(n),[...t]},L=(e)=>String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),P=(e,t)=>t==null||t===""?"":` ${e}="${L(t)}"`,D=(e)=>{if(Array.isArray(e))return e.map(D);if(e&&typeof e==="object")return Object.fromEntries(Object.entries(e).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,D(n)]));return e},Ke=new Set(["doc","paragraph","heading","bulletlist","orderedlist","listitem","tasklist","taskitem","blockquote","codeblock","horizontalrule","hardbreak","table","tablerow","tableheader","tablecell","imagecomponent","image","knowledgereview"]),be=(e,t=!0)=>e instanceof g.XmlText?{text:D(e.toDelta())}:{kind:e.nodeName,attributes:D(Object.fromEntries(Object.entries(e.getAttributes()).filter(([n])=>n!=="id"||!(t||Ke.has(e.nodeName.toLowerCase()))))),children:e.toArray().map((n)=>be(n,!1))},V=(e)=>ze("sha256").update(JSON.stringify(be(e))).digest("hex"),C=(e)=>e instanceof g.XmlElement&&e.nodeName==="knowledgeReview"?`Reviewed ${String(e.getAttribute("reviewedAt")??"")}: ${String(e.getAttribute("source")??"")}`:e instanceof g.XmlText?e.toDelta().map((t)=>typeof t.insert==="string"?t.insert:JSON.stringify(t.insert)).join(""):e.toArray().map((t)=>C(t)).join(" "),ye=(e)=>e.toArray().map((t,n)=>{let r=t instanceof g.XmlElement?String(t.getAttribute("id")??"")||null:null;return{index:n,anchor:r,shortAnchor:r?b(r).slice(0,8):null,kind:t instanceof g.XmlElement?t.nodeName:"text",preview:b(C(t)).replace(/\s+/g," ").trim().slice(0,40)}}),O=(e,t)=>{let n=e.toArray().flatMap((i,l)=>{if(!(i instanceof g.XmlElement))return[];let c=String(i.getAttribute("id")??"");return c.length>0&&c.toLowerCase().startsWith(t.toLowerCase())?[{node:i,index:l,anchor:c}]:[]});if(n.length===0)throw new d(`No top-level block matches "${t}". Run page outline to see current anchors.`,404);if(n.length!==1)throw new w(`Ambiguous block anchor "${t}": ${n.map((i)=>`${i.anchor} [${i.index}]`).join(", ")}`);let r=n[0];if(!r)throw new d("Block disappeared.");return r},G=(e)=>{let t=0;for(let n of e.toArray())if(n instanceof g.XmlElement&&!n.getAttribute("id"))n.setAttribute("id",Je()),t++;return t},q=(e,t,n=!1)=>{if(e instanceof g.XmlText){let a=C(e),o=n?b(a):a;if(o!==a)return t.add("Sensitive text was redacted; the printed block is not a lossless copy"),L(o);return e.toDelta().map((f)=>{let s=L(typeof f.insert==="string"?f.insert:JSON.stringify(f.insert));for(let[m,A]of Object.entries(f.attributes??{})){let y=Object.fromEntries(Object.entries(A&&typeof A==="object"?A:{}).map(([v,k])=>[v,n&&typeof k==="string"?b(k):k]));if(m==="bold")s=`<strong>${s}</strong>`;else if(m==="italic")s=`<em>${s}</em>`;else if(m==="strike")s=`<s>${s}</s>`;else if(m==="code")s=`<code>${s}</code>`;else if(m==="link")s=`<a${P("href",y.href)}${P("title",y.title)}>${s}</a>`;else if(t.add(`Mark ${m} is not representable by this Markdown reader`),m==="underline")s=`&lt;u&gt;${s}&lt;/u&gt;`}return s}).join("")}let r=e.nodeName.toLowerCase(),i=Object.fromEntries(Object.entries(e.getAttributes()).map(([a,o])=>[a,n&&typeof o==="string"?b(o):o])),l=()=>e.toArray().map((a)=>q(a,t,n)).join("");if(i.textAlign&&i.textAlign!=="left")t.add("Text alignment is not representable in Markdown");if(r==="knowledgereview"){let a=String(i.reviewedAt??""),o=String(i.source??"");if(typeof i.reviewedAt!=="string"||typeof i.source!=="string"||!pe(a)||!o.trim())t.add("Review metadata is invalid");if(Object.keys(i).some((f)=>!["id","reviewedAt","source"].includes(f))||e.length)t.add("Additional review attributes or content are not represented in Markdown");if(n&&(i.reviewedAt!==e.getAttribute("reviewedAt")||i.source!==e.getAttribute("source")))t.add("Sensitive review metadata was redacted; the printed block is not a lossless copy");return K({date:a,source:o})}if(r==="doc")return l();if(r==="paragraph")return`<p>${l()}</p>`;if(r==="heading"){let a=Math.min(6,Math.max(1,Number(i.level)||1));return`<h${a}>${l()}</h${a}>`}if(r==="bulletlist")return`<ul>${l()}</ul>`;if(r==="orderedlist")return`<ol${P("start",i.start)}>${l()}</ol>`;if(r==="listitem")return`<li>${l()}</li>`;if(r==="tasklist")return`<ul>${l()}</ul>`;if(r==="taskitem"){let a=`<input type="checkbox"${i.checked===!0||i.checked==="true"?" checked":""}>`,o=l().replace(/^<p>([\s\S]*?)<\/p>/,"$1");return`<li>${a}${o}</li>`}if(r==="blockquote")return`<blockquote>${l()}</blockquote>`;if(r==="codeblock"&&i.language==="knowledge-review")t.add("The knowledge-review fence language is reserved for review metadata");if(r==="codeblock")return`<pre><code${i.language?P("class",`language-${i.language}`):""}>${L(n?b(C(e)):C(e))}</code></pre>`;if(r==="horizontalrule")return"<hr>";if(r==="hardbreak")return"<br>";if(r==="table")return`<table>${l()}</table>`;if(r==="tablerow")return`<tr>${l()}</tr>`;if(r==="tablecell"||r==="tableheader"){let a=e.toArray().filter((s)=>s instanceof g.XmlElement),o=(s)=>s.nodeName.toLowerCase()==="hardbreak"||s.toArray().some((m)=>m instanceof g.XmlElement&&o(m));if(a.length>1||a.some((s)=>s.nodeName.toLowerCase()!=="paragraph"||o(s)))t.add("Multiple paragraphs, line breaks or block structure inside table cells are flattened in Markdown");if(Number(i.colspan??1)!==1||Number(i.rowspan??1)!==1)t.add("Merged table cells are not representable in Markdown");if(i.background||i.colwidth)t.add("Table styling is not representable in Markdown");let f=r==="tablecell"?"td":"th";return`<${f}>${l()}</${f}>`}if(r==="imagecomponent"||r==="image"){if(i.width||i.height||i.alignment)t.add("Image dimensions or alignment are not representable in Markdown");return`<img${P("src",i.src)}${P("alt",i.alt)}${P("title",i.title)}>`}t.add(`Unsupported node ${e.nodeName}; preserved as XML text`);let c=e.toString();return`<pre><code class="language-xml">${L(n?ue(c):c)}</code></pre>`},Ve=(e)=>{let t=new Set,n=e.toArray().map((r)=>q(r,t)).join("");return{markdown:j(n),losses:[...t]}},ve=(e,t)=>{let{node:n,anchor:r}=O(e,t),i=new Set;return{anchor:r,fingerprint:V(n),markdown:j(q(n,i,!0)),losses:[...i]}},xe=(e)=>{let t=new Set;for(let n of e)q(n,t);return[...t]},M=new ge({html:!1}).use(ke.default),Ge=M.renderer.rules.fence;M.renderer.rules.fence=(e,t,n,r,i)=>{let l=e[t];if(/^knowledge-review\s/.test(l?.info.trim()??""))throw new w("A knowledge-review fence does not accept additional info fields.");if(l?.info.trim()==="knowledge-review"){let c=he(l.content);if(!r?.reviewAsCode&&r?.requiredNodes instanceof Set)r.requiredNodes.add("knowledgeReview");if(!r?.reviewAsCode&&Array.isArray(r?.expectedReviews))r.expectedReviews.push(c);return r?.reviewAsCode?K(c):we(c)}return Ge?.(e,t,n,r,i)??i.renderToken(e,t,n)};M.core.ruler.before("github-task-lists","empty-task-items",(e)=>{for(let t=2;t<e.tokens.length;t++){let n=e.tokens[t],r=n?.children?.[0];if(n&&r&&/^\[[ xX]\]$/.test(n.content)&&e.tokens[t-1]?.tag==="p"&&e.tokens[t-2]?.tag==="li")n.content+=" ",r.content+=" "}});var Ae=(e)=>e.toArray().flatMap((t)=>t instanceof g.XmlElement?[...t.nodeName.toLowerCase()==="codeblock"?[t]:[],...Ae(t)]:[]),me=(e,t=!1,n,r)=>M.render(e,{reviewAsCode:t,requiredNodes:n,expectedReviews:r}).trim().replace(/(<li class="task-list-item">)\s*<p>([\s\S]*?)<\/p>/g,"$1$2").replace(/(<input class="task-list-item-checkbox"[^>]*>) /g,"$1"),$e=async(e,t)=>{let n=new Set,r=[],i=me(t,!1,n,r);if(n.size)S([...n],await e.nodeReaders?.()??[]);if(!i){let o=new g.Doc;return{doc:o,fragment:o.getXmlFragment("default"),losses:[]}}let l=i.replace(/<img([^>]*?)\s*\/?>/g,"<image-component$1></image-component>").replace(/<ul class="contains-task-list">/g,'<ul data-type="taskList">').replace(/<li class="task-list-item">(\s*<p>)?<input\b([^>]*)>/g,(o,f,s)=>`<li data-type="taskItem" data-checked="${/\bchecked=/.test(s)}">${f??""}`),c=await e.request("/live/convert-document",{method:"POST",body:{description_html:l,variant:"rich"}}),a=new g.Doc;try{if(typeof c.description_binary!=="string"||!c.description_binary)throw Error("Missing document binary");g.applyUpdate(a,Buffer.from(c.description_binary,"base64"));let o=a.getXmlFragment("default");if(r.length){let p=[],y=(v)=>{for(let k of v.toArray())if(k instanceof g.XmlElement)if(k.nodeName.toLowerCase()==="knowledgereview")p.push({date:String(k.getAttribute("reviewedAt")??""),source:String(k.getAttribute("source")??"")});else y(k)};if(y(o),JSON.stringify(p)!==JSON.stringify(r))throw new d("The converter did not preserve the confirmed knowledgeReview nodes and attributes. No document changes were sent.")}let f=M.parse(t,{}).filter((p)=>p.block&&p.tag==="code"&&p.info.trim()!=="knowledge-review").map((p)=>p.info.trim().split(/\s+/)[0]||null),s=Ae(o),m=[];if(f.length!==s.length)m.push("The converter changed the number of code blocks");else a.transact(()=>s.forEach((p,y)=>{let v=f[y];if(v)p.setAttribute("language",v);else p.removeAttribute("language")}));if(Ve(o).markdown!==j(me(t,!0)))m.push("The converter changed Markdown content or formatting");return a.transact(()=>G(o)),{doc:a,fragment:o,losses:m}}catch(o){if(a.destroy(),o instanceof d)throw o;throw new d(`Cannot decode the converted document: ${o instanceof Error?o.message:String(o)}`)}};import*as F from"yjs";var Q=(e,t=!1)=>{if(e.length&&!t)throw new w(`This edit can lose content or formatting: ${e.join("; ")}. Inspect the document, then pass --allow-loss to accept these losses.`)},Pe=(e,t,n)=>{let r=t.block?O(e,t.block):void 0;if(r&&t.ifMatch&&!t.force&&V(r.node)!==t.ifMatch)throw new d("Block content changed since page read. Read it again and use its new --if-match fingerprint, or pass --force to overwrite the concurrent edit.",409);let i=n?.fragment.length??0;if(t.kind!=="rm"&&!n)throw new w("Expected Markdown content.");if((t.kind==="insert"||r&&t.kind==="set")&&i===0)throw new w("Empty block content. Use page rm --block to remove a block.");let l=t.kind==="insert"?[]:r?[r.node]:e.toArray(),c=[...new Set([...n?.losses??[],...xe(l)])];if(t.kind!=="rm")Q(c,t.allowLoss);let a=r?.index??0;if(t.kind==="insert")a=t.after?O(e,t.after).index+1:e.length;let o=n?.fragment.toArray().map((s)=>{if(!(s instanceof F.XmlElement)&&!(s instanceof F.XmlText))throw new d("Unsupported document block; no changes were made.");return s.clone()})??[],f=e.toArray();if(t.kind!=="insert")f.splice(a,r?1:f.length);if(S(T([...f,...t.kind==="rm"?[]:n?.fragment.toArray()??[]]),t.nodeReaders??[]),t.kind!=="insert")e.delete(a,r?1:e.length);if(t.kind!=="rm"&&o.length){if(e.insert(a,o),r&&o[0]&&"setAttribute"in o[0])o[0].setAttribute("id",r.anchor)}return t.kind==="rm"?[]:c};import{HocuspocusProvider as Qe,HocuspocusProviderWebsocket as Ze}from"@hocuspocus/provider";import{HttpsProxyAgent as et}from"https-proxy-agent";import tt from"ws";import*as Re from"yjs";class Z extends d{}class Ye{doc=new Re.Doc;fragment=this.doc.getXmlFragment("default");socket;provider;agent;pending;failure;writing=!1;acknowledged=!1;disposed=!1;deadline;constructor(e,t,n,r=20000){this.deadline=r,I(n);let i=Ee(e);if(i)I(i),this.agent=new et(i);let l=this.agent;class c extends tt{constructor(a){super(a,{agent:l,handshakeTimeout:r})}}this.socket=new Ze({url:e,WebSocketPolyfill:c,autoConnect:!1,maxAttempts:1,onClose:()=>this.fail(new d("Live connection closed."))}),this.socket.on("maxAttemptsFailed",()=>this.fail(new d("Cannot connect to the live server."))),this.provider=new Qe({websocketProvider:this.socket,name:t,document:this.doc,awareness:null,token:n,forceSyncInterval:!1,flushDelay:!1,onClose:()=>this.fail(new d("Live document connection closed.")),onSynced:()=>this.progress(),onUnsyncedChanges:()=>this.progress(),onAuthenticationFailed:()=>this.fail(new Z("Live authentication was refused."))}),this.provider.attach()}progress(){if(this.disposed||this.failure||!this.provider?.isSynced||this.provider.hasUnsyncedChanges)return;if(this.writing)this.acknowledged=!0;this.pending?.resolve()}fail(e){if(this.disposed||this.failure)return;if(this.writing&&!this.acknowledged)e=new d("Live connection failed after sending changes; delivery is uncertain. Inspect the live document before retrying. The command was not replayed.");this.failure=e,this.socket.shouldConnect=!1,this.pending?.reject(e)}async wait(e){if(this.failure)throw this.failure;let t;try{await new Promise((n,r)=>{this.pending={resolve:n,reject:r},t=setTimeout(()=>this.fail(new d("Live synchronization timed out.")),this.deadline),e(),this.progress()})}finally{clearTimeout(t),this.pending=void 0}}async ready(){await this.wait(()=>{this.socket.connect().catch(()=>this.fail(new d("Cannot connect to the live server.")))})}async write(e){if(this.failure)throw this.failure;if(!this.provider.isSynced)throw new d("Live document is not synchronized.");if(this.provider.authorizedScope!=="read-write")throw new d("The connection does not allow writing this page.");let t=!1,n=(r,i)=>{if(i===this)t=!0};this.doc.on("update",n);try{return await this.wait(()=>{this.writing=!0,this.doc.transact(()=>e(this.fragment),this)}),{delivery:t?"acknowledged":"unchanged",persistence:"asynchronous"}}finally{this.doc.off("update",n)}}destroy(){if(this.disposed)return;this.disposed=!0,this.provider.destroy(),this.socket.destroy(),this.agent?.destroy(),this.doc.destroy()}}var Xe=async(e,t,n,r={})=>{let i=Se(t);await e.preparePages?.(t);let l=!!r.writable,c=await e.liveCredentials?.(l);if(!c){I(e.config.token.value);let a=await e.request("/api/extensions/configuration/").catch((o)=>{if(o instanceof d&&o.status===404)throw new d("Page commands require the for-plane API-key pages extension.",404);throw o});if(typeof a.release!=="string"||!a.release)throw new d("The for-plane runtime has no active extension release.");c={release:a.release,token:JSON.stringify({apiKey:e.config.token.value,readOnly:!l})}}for(let a=0;a<2;a++){let o=new URL(`${e.config.url.value}/live/collaboration`);if(o.protocol=o.protocol==="https:"?"wss:":"ws:",o.searchParams.set("documentType",i.kind==="wiki"?"workspace_page":"project_page"),i.kind==="project")o.searchParams.set("projectId",i.projectId);if(o.searchParams.set("workspaceSlug",e.config.workspace.value),c.release)o.searchParams.set("forPlaneRelease",c.release);let f=new Ye(o.href,n,c.token);try{return await f.ready(),f}catch(s){if(f.destroy(),a===0&&s instanceof Z){let m=await e.liveCredentials?.(l,!0);if(m){c=m;continue}}throw new d(b(s instanceof Error?s.message:String(s)))}}throw new d("Live session authentication failed after one refresh.")};var nt=async(e,t=!1)=>{let n=_(e,"file"),r=_(e,"text");if(n!==void 0&&r!==void 0)throw new w("--file and --text are mutually exclusive.");if(n!==void 0)try{return await rt(n,"utf8")}catch{throw new w(`Cannot read Markdown file "${n}".`)}if(r!==void 0||t)return r;throw new w("Expected --file <path> or --text <markdown>.")},Le=(e)=>{if(e.length)console.error(b(`Warning: ${e.join("; ")}`))},ee=(e)=>`${e.id} ${e.deleted?"deleted":e.delivery??"created"}${e.stamped!==void 0?`; stamped ${e.stamped} blocks`:""}${e.delivery?"; database persistence is asynchronous":""}`,jt=async(e,t,n,r,i=!1)=>{let l=i?void 0:U(n.positionals[0],"a project"),c=e==="page create",a=e==="page rm",o=c?B(n,"name"):U(n.positionals[i?0:1],"a page UUID or name"),f=i&&c&&n.flags.has("parent")?B(n,"parent"):void 0,s=n.flags.has("block")?B(n,"block"):void 0,m=n.flags.has("after")?B(n,"after"):void 0,A=N(n,"at-end"),p=_(n,"if-match"),y=N(n,"force"),v=N(n,"allow-loss");if(a&&!N(n,"yes"))throw new w("Deletion requires --yes.");if((p!==void 0||y)&&!s)throw new w("--if-match and --force require --block.");if(p!==void 0&&!/^[a-f0-9]{64}$/i.test(p))throw new w("--if-match expects the SHA-256 fingerprint from page read --json.");if(e==="page read"&&!s)throw new w("Expected --block <anchor>.");if(e==="page insert"&&Boolean(m)===A)throw new w("Choose exactly one of --after <anchor> or --at-end.");let k=c||e==="page set"||e==="page insert"?await nt(n,c):void 0,Y=await Ce(t,l),ie=f===void 0?void 0:(await re(t,Y,f)).id,E,H;try{if(k!==void 0)E=await $e(t,k),Q(E.losses,v);let u=c?await t.request(te(Y),{method:"POST",body:{name:o,access:0,...ie===void 0?{}:{parent:ie}}}):await re(t,Y,o);if(c)H=u;if(c&&!E){R({id:u.id,name:u.name},r,ee);return}if(a&&!s){if(!i)ne(u,!0);let x=`${te(Y)}${u.id}/`;if(!i&&!u.archived_at)try{await t.request(`${x}archive/`,{method:"POST"})}catch(h){throw new d(`Archiving page ${u.id} was not confirmed: ${h instanceof Error?h.message:String(h)}. Inspect this UUID before retrying; deletion was not attempted.`)}try{await t.request(x,{method:"DELETE"})}catch(h){throw new d(`${i?`Deletion of wiki page ${u.id} was not confirmed`:`Page ${u.id} was archived, but deletion was not confirmed`}: ${h instanceof Error?h.message:String(h)}. Inspect it by UUID before retrying.`)}R({id:u.id,deleted:!0},r,ee);return}let oe=e==="page outline"||e==="page read";if(!oe)ne(u);let X=await Xe(t,Y,u.id,{writable:!oe});try{if(e==="page outline")R(ye(X.fragment),r,(x)=>x.map((h)=>`${h.index} ${h.shortAnchor??"(no anchor)"} ${h.kind} ${h.preview}`).join(`
1
+ import{A as we,B as K,C as Se,D as Ce,E as te,G as re,H as ne,L as S,l as ge,n as j,o as U,p as B,x as ue,y as pe,z as he}from"./cli-1x07v9rm.js";import{O as Ee,T as d}from"./cli-sw04mw2d.js";import{ba as w,ca as _,da as N}from"./cli-76dfafab.js";import{ga as We,ha as Me,la as I,na as b,oa as R}from"./cli-3t21mat0.js";var fe=Me(function(it,de){var J=!0,ce=!1,le=!1;de.exports=function(e,t){if(t)J=!t.enabled,ce=!!t.label,le=!!t.labelAfter;e.core.ruler.after("inline","github-task-lists",function(n){var r=n.tokens;for(var i=2;i<r.length;i++)if(Be(r,i))De(r[i],n.Token),se(r[i-2],"class","task-list-item"+(!J?" enabled":"")),se(r[Ne(r,i-2)],"class","contains-task-list")})};function se(e,t,n){var r=e.attrIndex(t),i=[t,n];if(r<0)e.attrPush(i);else e.attrs[r]=i}function Ne(e,t){var n=e[t].level-1;for(var r=t-1;r>=0;r--)if(e[r].level===n)return r;return-1}function Be(e,t){return Ie(e[t])&&Ue(e[t-1])&&_e(e[t-2])&&He(e[t])}function De(e,t){if(e.children.unshift(je(e,t)),e.children[1].content=e.children[1].content.slice(3),e.content=e.content.slice(3),ce)if(le){e.children.pop();var n="task-item-"+Math.ceil(Math.random()*1e7-1000);e.children[0].content=e.children[0].content.slice(0,-1)+' id="'+n+'">',e.children.push(Fe(e.content,n,t))}else e.children.unshift(Oe(t)),e.children.push(qe(t))}function je(e,t){var n=new t("html_inline","",0),r=J?' disabled="" ':"";if(e.content.indexOf("[ ] ")===0)n.content='<input class="task-list-item-checkbox"'+r+'type="checkbox">';else if(e.content.indexOf("[x] ")===0||e.content.indexOf("[X] ")===0)n.content='<input class="task-list-item-checkbox" checked=""'+r+'type="checkbox">';return n}function Oe(e){var t=new e("html_inline","",0);return t.content="<label>",t}function qe(e){var t=new e("html_inline","",0);return t.content="</label>",t}function Fe(e,t,n){var r=new n("html_inline","",0);return r.content='<label class="task-list-item-label" for="'+t+'">'+e+"</label>",r.attrs=[{for:t}],r}function Ie(e){return e.type==="inline"}function Ue(e){return e.type==="paragraph_open"}function _e(e){return e.type==="list_item_open"}function He(e){return e.content.indexOf("[ ] ")===0||e.content.indexOf("[x] ")===0||e.content.indexOf("[X] ")===0}});import{readFile as rt}from"node:fs/promises";import{createHash as ze,randomUUID as Je}from"node:crypto";var ke=We(fe(),1);import*as g from"yjs";var T=(e)=>{let t=new Set,n=(r)=>{if(!(r instanceof g.XmlElement))return;if(r.nodeName.toLowerCase()==="knowledgereview")t.add("knowledgeReview");for(let i of r.toArray())n(i)};return e.forEach(n),[...t]},L=(e)=>String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),P=(e,t)=>t==null||t===""?"":` ${e}="${L(t)}"`,D=(e)=>{if(Array.isArray(e))return e.map(D);if(e&&typeof e==="object")return Object.fromEntries(Object.entries(e).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,D(n)]));return e},Ke=new Set(["doc","paragraph","heading","bulletlist","orderedlist","listitem","tasklist","taskitem","blockquote","codeblock","horizontalrule","hardbreak","table","tablerow","tableheader","tablecell","imagecomponent","image","knowledgereview"]),be=(e,t=!0)=>e instanceof g.XmlText?{text:D(e.toDelta())}:{kind:e.nodeName,attributes:D(Object.fromEntries(Object.entries(e.getAttributes()).filter(([n])=>n!=="id"||!(t||Ke.has(e.nodeName.toLowerCase()))))),children:e.toArray().map((n)=>be(n,!1))},V=(e)=>ze("sha256").update(JSON.stringify(be(e))).digest("hex"),C=(e)=>e instanceof g.XmlElement&&e.nodeName==="knowledgeReview"?`Reviewed ${String(e.getAttribute("reviewedAt")??"")}: ${String(e.getAttribute("source")??"")}`:e instanceof g.XmlText?e.toDelta().map((t)=>typeof t.insert==="string"?t.insert:JSON.stringify(t.insert)).join(""):e.toArray().map((t)=>C(t)).join(" "),ye=(e)=>e.toArray().map((t,n)=>{let r=t instanceof g.XmlElement?String(t.getAttribute("id")??"")||null:null;return{index:n,anchor:r,shortAnchor:r?b(r).slice(0,8):null,kind:t instanceof g.XmlElement?t.nodeName:"text",preview:b(C(t)).replace(/\s+/g," ").trim().slice(0,40)}}),O=(e,t)=>{let n=e.toArray().flatMap((i,l)=>{if(!(i instanceof g.XmlElement))return[];let c=String(i.getAttribute("id")??"");return c.length>0&&c.toLowerCase().startsWith(t.toLowerCase())?[{node:i,index:l,anchor:c}]:[]});if(n.length===0)throw new d(`No top-level block matches "${t}". Run page outline to see current anchors.`,404);if(n.length!==1)throw new w(`Ambiguous block anchor "${t}": ${n.map((i)=>`${i.anchor} [${i.index}]`).join(", ")}`);let r=n[0];if(!r)throw new d("Block disappeared.");return r},G=(e)=>{let t=0;for(let n of e.toArray())if(n instanceof g.XmlElement&&!n.getAttribute("id"))n.setAttribute("id",Je()),t++;return t},q=(e,t,n=!1)=>{if(e instanceof g.XmlText){let a=C(e),o=n?b(a):a;if(o!==a)return t.add("Sensitive text was redacted; the printed block is not a lossless copy"),L(o);return e.toDelta().map((f)=>{let s=L(typeof f.insert==="string"?f.insert:JSON.stringify(f.insert));for(let[m,A]of Object.entries(f.attributes??{})){let y=Object.fromEntries(Object.entries(A&&typeof A==="object"?A:{}).map(([v,k])=>[v,n&&typeof k==="string"?b(k):k]));if(m==="bold")s=`<strong>${s}</strong>`;else if(m==="italic")s=`<em>${s}</em>`;else if(m==="strike")s=`<s>${s}</s>`;else if(m==="code")s=`<code>${s}</code>`;else if(m==="link")s=`<a${P("href",y.href)}${P("title",y.title)}>${s}</a>`;else if(t.add(`Mark ${m} is not representable by this Markdown reader`),m==="underline")s=`&lt;u&gt;${s}&lt;/u&gt;`}return s}).join("")}let r=e.nodeName.toLowerCase(),i=Object.fromEntries(Object.entries(e.getAttributes()).map(([a,o])=>[a,n&&typeof o==="string"?b(o):o])),l=()=>e.toArray().map((a)=>q(a,t,n)).join("");if(i.textAlign&&i.textAlign!=="left")t.add("Text alignment is not representable in Markdown");if(r==="knowledgereview"){let a=String(i.reviewedAt??""),o=String(i.source??"");if(typeof i.reviewedAt!=="string"||typeof i.source!=="string"||!pe(a)||!o.trim())t.add("Review metadata is invalid");if(Object.keys(i).some((f)=>!["id","reviewedAt","source"].includes(f))||e.length)t.add("Additional review attributes or content are not represented in Markdown");if(n&&(i.reviewedAt!==e.getAttribute("reviewedAt")||i.source!==e.getAttribute("source")))t.add("Sensitive review metadata was redacted; the printed block is not a lossless copy");return K({date:a,source:o})}if(r==="doc")return l();if(r==="paragraph")return`<p>${l()}</p>`;if(r==="heading"){let a=Math.min(6,Math.max(1,Number(i.level)||1));return`<h${a}>${l()}</h${a}>`}if(r==="bulletlist")return`<ul>${l()}</ul>`;if(r==="orderedlist")return`<ol${P("start",i.start)}>${l()}</ol>`;if(r==="listitem")return`<li>${l()}</li>`;if(r==="tasklist")return`<ul>${l()}</ul>`;if(r==="taskitem"){let a=`<input type="checkbox"${i.checked===!0||i.checked==="true"?" checked":""}>`,o=l().replace(/^<p>([\s\S]*?)<\/p>/,"$1");return`<li>${a}${o}</li>`}if(r==="blockquote")return`<blockquote>${l()}</blockquote>`;if(r==="codeblock"&&i.language==="knowledge-review")t.add("The knowledge-review fence language is reserved for review metadata");if(r==="codeblock")return`<pre><code${i.language?P("class",`language-${i.language}`):""}>${L(n?b(C(e)):C(e))}</code></pre>`;if(r==="horizontalrule")return"<hr>";if(r==="hardbreak")return"<br>";if(r==="table")return`<table>${l()}</table>`;if(r==="tablerow")return`<tr>${l()}</tr>`;if(r==="tablecell"||r==="tableheader"){let a=e.toArray().filter((s)=>s instanceof g.XmlElement),o=(s)=>s.nodeName.toLowerCase()==="hardbreak"||s.toArray().some((m)=>m instanceof g.XmlElement&&o(m));if(a.length>1||a.some((s)=>s.nodeName.toLowerCase()!=="paragraph"||o(s)))t.add("Multiple paragraphs, line breaks or block structure inside table cells are flattened in Markdown");if(Number(i.colspan??1)!==1||Number(i.rowspan??1)!==1)t.add("Merged table cells are not representable in Markdown");if(i.background||i.colwidth)t.add("Table styling is not representable in Markdown");let f=r==="tablecell"?"td":"th";return`<${f}>${l()}</${f}>`}if(r==="imagecomponent"||r==="image"){if(i.width||i.height||i.alignment)t.add("Image dimensions or alignment are not representable in Markdown");return`<img${P("src",i.src)}${P("alt",i.alt)}${P("title",i.title)}>`}t.add(`Unsupported node ${e.nodeName}; preserved as XML text`);let c=e.toString();return`<pre><code class="language-xml">${L(n?ue(c):c)}</code></pre>`},Ve=(e)=>{let t=new Set,n=e.toArray().map((r)=>q(r,t)).join("");return{markdown:j(n),losses:[...t]}},ve=(e,t)=>{let{node:n,anchor:r}=O(e,t),i=new Set;return{anchor:r,fingerprint:V(n),markdown:j(q(n,i,!0)),losses:[...i]}},xe=(e)=>{let t=new Set;for(let n of e)q(n,t);return[...t]},M=new ge({html:!1}).use(ke.default),Ge=M.renderer.rules.fence;M.renderer.rules.fence=(e,t,n,r,i)=>{let l=e[t];if(/^knowledge-review\s/.test(l?.info.trim()??""))throw new w("A knowledge-review fence does not accept additional info fields.");if(l?.info.trim()==="knowledge-review"){let c=he(l.content);if(!r?.reviewAsCode&&r?.requiredNodes instanceof Set)r.requiredNodes.add("knowledgeReview");if(!r?.reviewAsCode&&Array.isArray(r?.expectedReviews))r.expectedReviews.push(c);return r?.reviewAsCode?K(c):we(c)}return Ge?.(e,t,n,r,i)??i.renderToken(e,t,n)};M.core.ruler.before("github-task-lists","empty-task-items",(e)=>{for(let t=2;t<e.tokens.length;t++){let n=e.tokens[t],r=n?.children?.[0];if(n&&r&&/^\[[ xX]\]$/.test(n.content)&&e.tokens[t-1]?.tag==="p"&&e.tokens[t-2]?.tag==="li")n.content+=" ",r.content+=" "}});var Ae=(e)=>e.toArray().flatMap((t)=>t instanceof g.XmlElement?[...t.nodeName.toLowerCase()==="codeblock"?[t]:[],...Ae(t)]:[]),me=(e,t=!1,n,r)=>M.render(e,{reviewAsCode:t,requiredNodes:n,expectedReviews:r}).trim().replace(/(<li class="task-list-item">)\s*<p>([\s\S]*?)<\/p>/g,"$1$2").replace(/(<input class="task-list-item-checkbox"[^>]*>) /g,"$1"),$e=async(e,t)=>{let n=new Set,r=[],i=me(t,!1,n,r);if(n.size)S([...n],await e.nodeReaders?.()??[]);if(!i){let o=new g.Doc;return{doc:o,fragment:o.getXmlFragment("default"),losses:[]}}let l=i.replace(/<img([^>]*?)\s*\/?>/g,"<image-component$1></image-component>").replace(/<ul class="contains-task-list">/g,'<ul data-type="taskList">').replace(/<li class="task-list-item">(\s*<p>)?<input\b([^>]*)>/g,(o,f,s)=>`<li data-type="taskItem" data-checked="${/\bchecked=/.test(s)}">${f??""}`),c=await e.request("/live/convert-document",{method:"POST",body:{description_html:l,variant:"rich"}}),a=new g.Doc;try{if(typeof c.description_binary!=="string"||!c.description_binary)throw Error("Missing document binary");g.applyUpdate(a,Buffer.from(c.description_binary,"base64"));let o=a.getXmlFragment("default");if(r.length){let p=[],y=(v)=>{for(let k of v.toArray())if(k instanceof g.XmlElement)if(k.nodeName.toLowerCase()==="knowledgereview")p.push({date:String(k.getAttribute("reviewedAt")??""),source:String(k.getAttribute("source")??"")});else y(k)};if(y(o),JSON.stringify(p)!==JSON.stringify(r))throw new d("The converter did not preserve the confirmed knowledgeReview nodes and attributes. No document changes were sent.")}let f=M.parse(t,{}).filter((p)=>p.block&&p.tag==="code"&&p.info.trim()!=="knowledge-review").map((p)=>p.info.trim().split(/\s+/)[0]||null),s=Ae(o),m=[];if(f.length!==s.length)m.push("The converter changed the number of code blocks");else a.transact(()=>s.forEach((p,y)=>{let v=f[y];if(v)p.setAttribute("language",v);else p.removeAttribute("language")}));if(Ve(o).markdown!==j(me(t,!0)))m.push("The converter changed Markdown content or formatting");return a.transact(()=>G(o)),{doc:a,fragment:o,losses:m}}catch(o){if(a.destroy(),o instanceof d)throw o;throw new d(`Cannot decode the converted document: ${o instanceof Error?o.message:String(o)}`)}};import*as F from"yjs";var Q=(e,t=!1)=>{if(e.length&&!t)throw new w(`This edit can lose content or formatting: ${e.join("; ")}. Inspect the document, then pass --allow-loss to accept these losses.`)},Pe=(e,t,n)=>{let r=t.block?O(e,t.block):void 0;if(r&&t.ifMatch&&!t.force&&V(r.node)!==t.ifMatch)throw new d("Block content changed since page read. Read it again and use its new --if-match fingerprint, or pass --force to overwrite the concurrent edit.",409);let i=n?.fragment.length??0;if(t.kind!=="rm"&&!n)throw new w("Expected Markdown content.");if((t.kind==="insert"||r&&t.kind==="set")&&i===0)throw new w("Empty block content. Use page rm --block to remove a block.");let l=t.kind==="insert"?[]:r?[r.node]:e.toArray(),c=[...new Set([...n?.losses??[],...xe(l)])];if(t.kind!=="rm")Q(c,t.allowLoss);let a=r?.index??0;if(t.kind==="insert")a=t.after?O(e,t.after).index+1:e.length;let o=n?.fragment.toArray().map((s)=>{if(!(s instanceof F.XmlElement)&&!(s instanceof F.XmlText))throw new d("Unsupported document block; no changes were made.");return s.clone()})??[],f=e.toArray();if(t.kind!=="insert")f.splice(a,r?1:f.length);if(S(T([...f,...t.kind==="rm"?[]:n?.fragment.toArray()??[]]),t.nodeReaders??[]),t.kind!=="insert")e.delete(a,r?1:e.length);if(t.kind!=="rm"&&o.length){if(e.insert(a,o),r&&o[0]&&"setAttribute"in o[0])o[0].setAttribute("id",r.anchor)}return t.kind==="rm"?[]:c};import{HocuspocusProvider as Qe,HocuspocusProviderWebsocket as Ze}from"@hocuspocus/provider";import{HttpsProxyAgent as et}from"https-proxy-agent";import tt from"ws";import*as Re from"yjs";class Z extends d{}class Ye{doc=new Re.Doc;fragment=this.doc.getXmlFragment("default");socket;provider;agent;pending;failure;writing=!1;acknowledged=!1;disposed=!1;deadline;constructor(e,t,n,r=20000){this.deadline=r,I(n);let i=Ee(e);if(i)I(i),this.agent=new et(i);let l=this.agent;class c extends tt{constructor(a){super(a,{agent:l,handshakeTimeout:r})}}this.socket=new Ze({url:e,WebSocketPolyfill:c,autoConnect:!1,maxAttempts:1,onClose:()=>this.fail(new d("Live connection closed."))}),this.socket.on("maxAttemptsFailed",()=>this.fail(new d("Cannot connect to the live server."))),this.provider=new Qe({websocketProvider:this.socket,name:t,document:this.doc,awareness:null,token:n,forceSyncInterval:!1,flushDelay:!1,onClose:()=>this.fail(new d("Live document connection closed.")),onSynced:()=>this.progress(),onUnsyncedChanges:()=>this.progress(),onAuthenticationFailed:()=>this.fail(new Z("Live authentication was refused."))}),this.provider.attach()}progress(){if(this.disposed||this.failure||!this.provider?.isSynced||this.provider.hasUnsyncedChanges)return;if(this.writing)this.acknowledged=!0;this.pending?.resolve()}fail(e){if(this.disposed||this.failure)return;if(this.writing&&!this.acknowledged)e=new d("Live connection failed after sending changes; delivery is uncertain. Inspect the live document before retrying. The command was not replayed.");this.failure=e,this.socket.shouldConnect=!1,this.pending?.reject(e)}async wait(e){if(this.failure)throw this.failure;let t;try{await new Promise((n,r)=>{this.pending={resolve:n,reject:r},t=setTimeout(()=>this.fail(new d("Live synchronization timed out.")),this.deadline),e(),this.progress()})}finally{clearTimeout(t),this.pending=void 0}}async ready(){await this.wait(()=>{this.socket.connect().catch(()=>this.fail(new d("Cannot connect to the live server.")))})}async write(e){if(this.failure)throw this.failure;if(!this.provider.isSynced)throw new d("Live document is not synchronized.");if(this.provider.authorizedScope!=="read-write")throw new d("The connection does not allow writing this page.");let t=!1,n=(r,i)=>{if(i===this)t=!0};this.doc.on("update",n);try{return await this.wait(()=>{this.writing=!0,this.doc.transact(()=>e(this.fragment),this)}),{delivery:t?"acknowledged":"unchanged",persistence:"asynchronous"}}finally{this.doc.off("update",n)}}destroy(){if(this.disposed)return;this.disposed=!0,this.provider.destroy(),this.socket.destroy(),this.agent?.destroy(),this.doc.destroy()}}var Xe=async(e,t,n,r={})=>{let i=Se(t);await e.preparePages?.(t);let l=!!r.writable,c=await e.liveCredentials?.(l);if(!c){I(e.config.token.value);let a=await e.request("/api/extensions/configuration/").catch((o)=>{if(o instanceof d&&o.status===404)throw new d("Page commands require the for-plane API-key pages extension.",404);throw o});if(typeof a.release!=="string"||!a.release)throw new d("The for-plane runtime has no active extension release.");c={release:a.release,token:JSON.stringify({apiKey:e.config.token.value,readOnly:!l})}}for(let a=0;a<2;a++){let o=new URL(`${e.config.url.value}/live/collaboration`);if(o.protocol=o.protocol==="https:"?"wss:":"ws:",o.searchParams.set("documentType",i.kind==="wiki"?"workspace_page":"project_page"),i.kind==="project")o.searchParams.set("projectId",i.projectId);if(o.searchParams.set("workspaceSlug",e.config.workspace.value),c.release)o.searchParams.set("forPlaneRelease",c.release);let f=new Ye(o.href,n,c.token);try{return await f.ready(),f}catch(s){if(f.destroy(),a===0&&s instanceof Z){let m=await e.liveCredentials?.(l,!0);if(m){c=m;continue}}throw new d(b(s instanceof Error?s.message:String(s)))}}throw new d("Live session authentication failed after one refresh.")};var nt=async(e,t=!1)=>{let n=_(e,"file"),r=_(e,"text");if(n!==void 0&&r!==void 0)throw new w("--file and --text are mutually exclusive.");if(n!==void 0)try{return await rt(n,"utf8")}catch{throw new w(`Cannot read Markdown file "${n}".`)}if(r!==void 0||t)return r;throw new w("Expected --file <path> or --text <markdown>.")},Le=(e)=>{if(e.length)console.error(b(`Warning: ${e.join("; ")}`))},ee=(e)=>`${e.id} ${e.deleted?"deleted":e.delivery??"created"}${e.stamped!==void 0?`; stamped ${e.stamped} blocks`:""}${e.delivery?"; database persistence is asynchronous":""}`,jt=async(e,t,n,r,i=!1)=>{let l=i?void 0:U(n.positionals[0],"a project"),c=e==="page create",a=e==="page rm",o=c?B(n,"name"):U(n.positionals[i?0:1],"a page UUID or name"),f=i&&c&&n.flags.has("parent")?B(n,"parent"):void 0,s=n.flags.has("block")?B(n,"block"):void 0,m=n.flags.has("after")?B(n,"after"):void 0,A=N(n,"at-end"),p=_(n,"if-match"),y=N(n,"force"),v=N(n,"allow-loss");if(a&&!N(n,"yes"))throw new w("Deletion requires --yes.");if((p!==void 0||y)&&!s)throw new w("--if-match and --force require --block.");if(p!==void 0&&!/^[a-f0-9]{64}$/i.test(p))throw new w("--if-match expects the SHA-256 fingerprint from page read --json.");if(e==="page read"&&!s)throw new w("Expected --block <anchor>.");if(e==="page insert"&&Boolean(m)===A)throw new w("Choose exactly one of --after <anchor> or --at-end.");let k=c||e==="page set"||e==="page insert"?await nt(n,c):void 0,Y=await Ce(t,l),ie=f===void 0?void 0:(await re(t,Y,f)).id,E,H;try{if(k!==void 0)E=await $e(t,k),Q(E.losses,v);let u=c?await t.request(te(Y),{method:"POST",body:{name:o,access:0,...ie===void 0?{}:{parent:ie}}}):await re(t,Y,o);if(c)H=u;if(c&&!E){R({id:u.id,name:u.name},r,ee);return}if(a&&!s){if(!i)ne(u,!0);let x=`${te(Y)}${u.id}/`;if(!i&&!u.archived_at)try{await t.request(`${x}archive/`,{method:"POST"})}catch(h){throw new d(`Archiving page ${u.id} was not confirmed: ${h instanceof Error?h.message:String(h)}. Inspect this UUID before retrying; deletion was not attempted.`)}try{await t.request(x,{method:"DELETE"})}catch(h){throw new d(`${i?`Deletion of wiki page ${u.id} was not confirmed`:`Page ${u.id} was archived, but deletion was not confirmed`}: ${h instanceof Error?h.message:String(h)}. Inspect it by UUID before retrying.`)}R({id:u.id,deleted:!0},r,ee);return}let oe=e==="page outline"||e==="page read";if(!oe)ne(u);let X=await Xe(t,Y,u.id,{writable:!oe});try{if(e==="page outline")R(ye(X.fragment),r,(x)=>x.map((h)=>`${h.index} ${h.shortAnchor??"(no anchor)"} ${h.kind} ${h.preview}`).join(`
2
2
  `));else if(e==="page read"){let x=ve(X.fragment,U(s,"--block <anchor>"));Le(x.losses),R(x,r,(h)=>h.markdown)}else{let h=T([...X.fragment.toArray(),...E?.fragment.toArray()??[]]).length?await t.nodeReaders?.()??[]:[],ae,W=[];t.markPageMutation?.();let Te=await X.write((z)=>{if(e==="page stamp")S(T(z.toArray()),h),ae=G(z);else W=Pe(z,{kind:a?"rm":e==="page insert"?"insert":"set",block:s,after:m,atEnd:A,ifMatch:p?.toLowerCase(),force:y,allowLoss:v,nodeReaders:h},E)});Le(W),R({id:u.id,...Te,stamped:ae,losses:W},r,ee)}}finally{X.destroy()}}catch(u){if(H)throw new d(`Page ${H.id} was created, but its content operation did not complete: ${u instanceof Error?u.message:String(u)}. Inspect this page before retrying; do not create a duplicate.`);throw u}finally{E?.doc.destroy()}};export{jt as runPageContent};
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{b as Jt,c as Xt,d as De}from"./chunks/cli-v5kb8p5t.js";import{D as Ie,F as Dt,G as zt,I as Ht,J as Mt,K as Ft,M as en,e as F,f as J,g as y,h as j,i as C,j as at,k as b,m as D,n as U,o as u,p as P,q as R,r as v,s as oe,t as ye,u as I,v as he,w as Qt}from"./chunks/cli-6zgwwatf.js";import{N as Bt,R as Kt,S as Yt,T as S,U as Zt}from"./chunks/cli-sw04mw2d.js";import{$ as Wt,V as qe,W as Le,X as Ee,Y as O,Z as q,_ as Gt,aa as W,ba as d,ca as i,da as h,ea as Vt,fa as se}from"./chunks/cli-76dfafab.js";import{ja as ln,ka as w,la as ve,oa as x,pa as ae,qa as z,ra as g,sa as we}from"./chunks/cli-3t21mat0.js";var K=()=>({groups:Ee,flow:Le,notes:qe,globalOptions:q}),le=(e)=>`${e.name}${e.args===void 0?"":` ${e.args}`}`,B=(e,t,n)=>{let o=e.split(/\s+/),r=[],s="";for(let a of o)if(s==="")s=a;else if(`${s} ${a}`.length+n.length<=t)s=`${s} ${a}`;else r.push(n+s),s=a;if(s!=="")r.push(n+s);return r},Y=(e)=>{let t=[];for(let n of e.groups){if(t.push(n.title),n.summary!==void 0)t.push(...B(n.summary,96," "),"");t.push(...w(n.commands.map((o)=>({name:le(o),text:o.alias===void 0?o.summary:`${o.summary} (alias: ${o.alias})`})))),t.push("")}t.push("FLOW"),t.push(...w(e.flow.map((n)=>({name:n.command,text:n.summary})))),t.push(""),t.push(Z(e.globalOptions),""),t.push("HOW THIS TOOL BEHAVES");for(let n of e.notes)t.push(` ${n.title}`),t.push(...B(n.body,96," ")),t.push("");return t.push("Flags and examples for one command: i-plane <command> --help"),t.join(`
2
+ import{b as Jt,c as Xt,d as De}from"./chunks/cli-v5kb8p5t.js";import{D as Ie,F as Dt,G as zt,I as Ht,J as Mt,K as Ft,M as en,e as F,f as J,g as y,h as j,i as C,j as at,k as b,m as D,n as U,o as u,p as P,q as R,r as v,s as oe,t as ye,u as I,v as he,w as Qt}from"./chunks/cli-1x07v9rm.js";import{N as Bt,R as Kt,S as Yt,T as S,U as Zt}from"./chunks/cli-sw04mw2d.js";import{$ as Wt,V as qe,W as Le,X as Ee,Y as O,Z as q,_ as Gt,aa as W,ba as d,ca as i,da as h,ea as Vt,fa as se}from"./chunks/cli-76dfafab.js";import{ja as ln,ka as w,la as ve,oa as x,pa as ae,qa as z,ra as g,sa as we}from"./chunks/cli-3t21mat0.js";var K=()=>({groups:Ee,flow:Le,notes:qe,globalOptions:q}),le=(e)=>`${e.name}${e.args===void 0?"":` ${e.args}`}`,B=(e,t,n)=>{let o=e.split(/\s+/),r=[],s="";for(let a of o)if(s==="")s=a;else if(`${s} ${a}`.length+n.length<=t)s=`${s} ${a}`;else r.push(n+s),s=a;if(s!=="")r.push(n+s);return r},Y=(e)=>{let t=[];for(let n of e.groups){if(t.push(n.title),n.summary!==void 0)t.push(...B(n.summary,96," "),"");t.push(...w(n.commands.map((o)=>({name:le(o),text:o.alias===void 0?o.summary:`${o.summary} (alias: ${o.alias})`})))),t.push("")}t.push("FLOW"),t.push(...w(e.flow.map((n)=>({name:n.command,text:n.summary})))),t.push(""),t.push(Z(e.globalOptions),""),t.push("HOW THIS TOOL BEHAVES");for(let n of e.notes)t.push(` ${n.title}`),t.push(...B(n.body,96," ")),t.push("");return t.push("Flags and examples for one command: i-plane <command> --help"),t.join(`
3
3
  `)},Z=(e=q)=>["GLOBAL OPTIONS",...w(e.map((t)=>({name:`${t.flag}${t.value===void 0?"":` ${t.value}`}`,text:t.summary})))].join(`
4
4
  `),ce=(e,t=!0)=>{let{command:n}=e,o=[`i-plane ${le(n)}`,"",...B(n.summary,96," ")];if(n.alias!==void 0)o.push("",` alias: ${n.alias}`);let r=(n.options??[]).filter((s)=>s.flag!=="--json");if(r.length>0)o.push("","OPTIONS"),o.push(...w(r.map((s)=>({name:s.value===void 0?s.flag:`${s.flag} ${s.value}`,text:`${s.required===!0?"Required. ":""}${s.summary}`}))));if(n.notes!==void 0&&n.notes.length>0){o.push("","USAGE NOTES");for(let s of n.notes)o.push(...B(s,96," "),"");if(o[o.length-1]==="")o.pop()}if(n.examples!==void 0&&n.examples.length>0){o.push("","EXAMPLES");for(let s of n.examples)o.push(` ${s}`)}if(n.next!==void 0&&n.next.length>0){o.push("","USUALLY NEXT");for(let s of n.next)o.push(` ${s}`)}if(t)o.push("",Z(e.globalOptions));return o.join(`
5
5
  `)},Ue=(e,t)=>{let n=[t,"",` i-plane ${le(e)}`];if(e.examples!==void 0&&e.examples.length>0){n.push("");for(let r of e.examples)n.push(` ${r}`)}let o=(e.options??[]).filter((r)=>r.flag!=="--json"&&r.value!==void 0);if(o.length>0)n.push(""," flags:"),n.push(...w(o.map((r)=>({name:`${r.flag} ${r.value}`,text:`${r.required===!0?"Required. ":""}${r.summary}`}))," "));return n.push("",` full help: i-plane ${e.name} --help`),n.join(`
@@ -32,7 +32,7 @@ ${X(e.comments)}`},ct=async(e,t)=>{let n=t.positionals.join(" ").trim();if(n==="
32
32
 
33
33
  showing the first ${t} matches; more exist — raise --limit (up to 1000) or narrow the query`:o};var H=(e,t,n=!1)=>y(e,u((n?t.positionals[0]:void 0)??i(t,"project"),"--project <ref>"),"id,name,identifier,timezone"),je=async(e,t,n)=>{let o=await H(e,t,!0);return(await e.listAll(`projects/${o.id}/${n}s/`,{query:{fields:n==="cycle"?"id,name,start_date,end_date":"id,name,start_date,target_date,status",per_page:100}})).map((s)=>be(s,o,n))},be=(e,t,n)=>n==="cycle"&&t.timezone!==void 0?{...e,timezone:t.timezone}:e,re=(e,t,n)=>e.listAll(`projects/${t}/${n}s-lite/`,{query:{per_page:100}}),wt=(e,t)=>{let n={},o=i(e,"name");if(o!==void 0)n.name=u(o,`a ${t} name`);let r=i(e,"description");if(r!==void 0)n.description=r;let s=i(e,"start"),a=t==="cycle"?"end":"due",l=i(e,a),p=s===void 0?null:v(s,"start"),m=l===void 0?null:v(l,a);if(t==="cycle"&&(s===void 0!==(l===void 0)||p===null!==(m===null)))throw new d("A cycle needs both --start and --end, or neither for a draft.");if(p!==null&&m!==null&&p>m)throw new d("The start date must not be after the end date.");if(s!==void 0)n.start_date=p;if(l!==void 0)n[t==="cycle"?"end_date":"target_date"]=m;if(t==="module"){let f=i(e,"status");if(f!==void 0)n.status=R(f,["backlog","planned","in-progress","paused","completed","cancelled"],"status")}return n},xe=async(e,t,n)=>{let o={...wt(t,n),name:u(t.positionals.join(" "),`a ${n} name`)},r=await H(e,t);if(n==="cycle"){let a=i(t,"owner");o.owned_by=a===void 0?(await e.request("/api/v1/users/me/")).id:await te(e,a),o.project_id=r.id}let s=await e.request(`projects/${r.id}/${n}s/`,{method:"POST",body:o});return be(s,r,n)},ht=async(e,t)=>{let n=u(t.positionals[0],"a cycle name or UUID"),o=wt(t,"cycle"),r=i(t,"owner");if(r===void 0)I(o);let s=await H(e,t),a=b(await re(e,s.id,"cycle"),n,"cycle");if(r!==void 0)o.owned_by=await te(e,r);else{let p=await e.request(`projects/${s.id}/cycles/${a.id}/`,{query:{fields:"id,name,owned_by"}});if(!p.owned_by)throw new S("Cannot preserve the cycle owner: the server did not return owned_by. Pass --owner explicitly.");o.owned_by=p.owned_by}let l=await e.request(`projects/${s.id}/cycles/${a.id}/`,{method:"PATCH",body:o});return be(l??{...a,...o},s,"cycle")},Ce=async(e,t,n)=>{if(t.positionals.length===0)throw new d("Expected one or more work item references.");let o=P(t,n),r=await H(e,t),s=b(await re(e,r.id,n),o,n),a=new Set;for(let l of t.positionals){let p=await j(e,l,r.id);if(p.projectId!==r.id)throw new d(`${l} does not belong to project ${r.identifier}.`);a.add(p.issue.id)}return await e.request(`projects/${r.id}/${n}s/${s.id}/${n}-issues/`,{method:"POST",body:{issues:[...a]}}),{project:r.identifier,id:s.id,name:s.name,issues:[...a]}},ke=async(e,t,n)=>{let o=u(t.positionals[0],`a ${n} name or UUID`),r=await H(e,t),s=b(await re(e,r.id,n),o,n),l=(await e.listAll(`projects/${r.id}/${n}s/${s.id}/${n}-issues/`,{query:{fields:"id,name,sequence_id,priority,state",expand:"state",per_page:100}})).map((p)=>Pe(p,r.identifier));return{rows:l,total:l.length}},Pt=async(e,t)=>{let n=u(t.positionals[0],"a source cycle"),o=u(t.positionals[1],"a target cycle"),r=await H(e,t),s=await re(e,r.id,"cycle"),a=b(s,n,"cycle"),l=b(s,o,"cycle");if(a.id===l.id)throw new d("Source and target cycles must be different.");return await e.request(`projects/${r.id}/cycles/${a.id}/transfer-issues/`,{method:"POST",body:{new_cycle_id:l.id}}),{project:r.identifier,from:a,to:l}},gt=(e,t)=>{if(e==null)return"?";if(/^\d{4}-\d{2}-\d{2}$/.test(e)||t===void 0)return e;try{return new Intl.DateTimeFormat("sv-SE",{timeZone:t,calendar:"iso8601",numberingSystem:"latn",year:"numeric",month:"2-digit",day:"2-digit"}).format(new Date(e))}catch{return e}},N=(e)=>{let t=e.end_date??e.target_date,n=e.start_date==null&&t==null?"":` ${gt(e.start_date,e.timezone)} / ${gt(t,e.timezone)}`;return`${g(e.name)} ${e.id}${n}${e.status===void 0?"":` (${e.status})`}`},Re=(e)=>e.length===0?"no entries":e.map(N).join(`
34
34
  `),_e=(e)=>`added ${e.issues.length} work items to ${g(e.name)}`,$t=(e)=>w([{name:"from",text:g(e.from.name)},{name:"to",text:g(e.to.name)}],"").join(`
35
- `);var jt=(e)=>{let t=u(e,"a project name");if(t.length>255||/[&+,:;$^}{*=?@#|'<>.()%!-]/.test(t))throw new d("Project name cannot contain special characters (including hyphens) or exceed 255 characters.");return t},bt=(e)=>{let t=e.trim().toUpperCase();if(!/^[A-Z][A-Z0-9]{0,11}$/.test(t))throw new d("--identifier expects 1–12 letters or digits, starting with a letter.");return t},xt=(e)=>{let t={};for(let[n,o]of[["intake","intake_view"],["cycles","cycle_view"],["modules","module_view"]])if(e.flags.has(n))t[o]=h(e,n);return t},Ct=async(e,t)=>{let n={...xt(t),name:jt(t.positionals.join(" ")),identifier:bt(P(t,"identifier"))},o=i(t,"description");if(o!==void 0)n.description=o;let r=n.intake_view===!0;if(r)delete n.intake_view;let s=await e.request("projects/",{method:"POST",body:n});if(!r)return s;try{return await e.request(`projects/${s.id}/`,{method:"PATCH",body:{intake_view:!0}})??{...s,intake_view:!0}}catch(a){return z(`${s.identifier} was created, but intake setup failed: ${a instanceof Error?a.message:String(a)}. Retry with i-plane project update ${s.id} --intake.`),s}},kt=async(e,t)=>{let n=u(t.positionals[0],"a project reference"),o={...xt(t)},r=i(t,"name");if(r!==void 0)o.name=jt(r);let s=i(t,"description");if(s!==void 0)o.description=s;let a=i(t,"identifier");if(a!==void 0)o.identifier=bt(a);I(o);let l=await y(e,n);return await e.request(`projects/${l.id}/`,{method:"PATCH",body:o})??{...l,...o}},Rt=async(e,t)=>{let n=await y(e,u(t.positionals[0],"a project reference"));return await e.request(`projects/${n.id}/archive/`,{method:"POST"}),n},G=(e)=>`${e.identifier} ${g(e.name)}`,_t=async(e,t)=>{let n={name:u(t.positionals.join(" "),"a label name")},o=P(t,"project"),r=i(t,"color");n.color=oe(r??"#808080");let s=i(t,"description");if(s!==void 0)n.description=s;let a=await y(e,o);return e.request(`projects/${a.id}/labels/`,{method:"POST",body:n})},At=(e)=>{let t={},n=i(e,"name");if(n!==void 0)t.name=u(n,"a state name");let o=i(e,"color");if(o!==void 0)t.color=oe(o);let r=i(e,"group");if(r!==void 0)t.group=R(r,M,"group");let s=i(e,"description");if(s!==void 0)t.description=s;return t},It=async(e,t)=>{let n=u(t.positionals.join(" "),"a state name"),o=oe(P(t,"color")),r=R(P(t,"group"),M,"group"),s={...At(t),name:n,color:o,group:r},a=await y(e,P(t,"project"));return e.request(`projects/${a.id}/states/`,{method:"POST",body:s})},St=async(e,t)=>{let n=u(t.positionals[0],"a state name or UUID"),o=At(t);I(o);let r=await y(e,P(t,"project")),s=b(await C(e,r.id),n,"state");return await e.request(`projects/${r.id}/states/${s.id}/`,{method:"PATCH",body:o})??{...s,...o}},Ae=(e)=>{if(!h(e,"yes"))throw new d("Deleting cannot be undone. Repeat with --yes.")},vt=async(e,t)=>{Ae(t);let n=await y(e,u(t.positionals[0],"a project reference"));return await e.request(`projects/${n.id}/`,{method:"DELETE"}),n},Ot=async(e,t)=>{Ae(t);let n=u(t.positionals[0],"a label name or UUID"),o=await y(e,P(t,"project")),r=await e.listAll(`projects/${o.id}/labels/`,{query:{fields:"id,name",per_page:100}}),s=b(r,n,"label");return await e.request(`projects/${o.id}/labels/${s.id}/`,{method:"DELETE"}),s},Tt=async(e,t)=>{Ae(t);let n=u(t.positionals[0],"a state name or UUID"),o=await y(e,P(t,"project")),r=b(await C(e,o.id),n,"state");return await e.request(`projects/${o.id}/states/${r.id}/`,{method:"DELETE"}),r};var c=(e,t)=>async(n,o)=>x(await e(n),o,t),dn={cycles:c(({client:e,args:t})=>je(e,t,"cycle"),Re),"cycle create":c(({client:e,args:t})=>xe(e,t,"cycle"),(e)=>`created ${N(e)}`),"cycle update":c(({client:e,args:t})=>ht(e,t),N),"cycle add":c(({client:e,args:t})=>Ce(e,t,"cycle"),_e),"cycle issues":c(({client:e,args:t})=>ke(e,t,"cycle"),ne),"cycle transfer":c(({client:e,args:t})=>Pt(e,t),$t),modules:c(({client:e,args:t})=>je(e,t,"module"),Re),"module create":c(({client:e,args:t})=>xe(e,t,"module"),(e)=>`created ${N(e)}`),"module add":c(({client:e,args:t})=>Ce(e,t,"module"),_e),"module issues":c(({client:e,args:t})=>ke(e,t,"module"),ne),"intake list":c(({client:e,args:t})=>tt(e,t),fe),"intake create":c(({client:e,args:t})=>nt(e,t),(e)=>`created ${ee(e)}`),"intake show":c(({client:e,args:t})=>rt(e,t),ee),"intake update":c(({client:e,args:t})=>ot(e,t),ee),"intake rm":c(({client:e,args:t})=>st(e,t),(e)=>`deleted intake entry ${e.ref}`),summary:c(({client:e,config:t})=>ze(e,t),He),projects:c(({client:e})=>J(e),Me),list:c(({client:e,args:t})=>it(e,t),ne),show:c(({client:e,args:t,config:n})=>dt(e,t,n.workspace.value,n.url.value),lt),create:c(({client:e,args:t})=>ct(e,t),(e)=>`created ${e.ref} ${e.name}`),update:c(({client:e,args:t})=>$e(e,t),(e)=>`${e.ref} ${e.name} (${e.state})`),done:c(({client:e,args:t})=>ut(e,t),(e)=>`${e.ref} ${e.state}`),delete:c(({client:e,args:t})=>pt(e,t),(e)=>e),comment:c(({client:e,args:t})=>mt(e,t),(e)=>e),comments:c(({client:e,args:t})=>Xe(e,t),X),search:c(({client:e,args:t})=>ft(e,t),yt),states:c(({client:e,args:t})=>Fe(e,t),Ne),labels:c(({client:e,args:t})=>Ge(e,t),We),members:c(({client:e})=>Ve(e),Be),whoami:c(({client:e})=>Ze(e),Je),"project create":c(({client:e,args:t})=>Ct(e,t),(e)=>`created ${G(e)}`),"project update":c(({client:e,args:t})=>kt(e,t),G),"project archive":c(({client:e,args:t})=>Rt(e,t),(e)=>`archived ${G(e)}`),"project rm":c(({client:e,args:t})=>vt(e,t),(e)=>`deleted ${G(e)}`),"label create":c(({client:e,args:t})=>_t(e,t),(e)=>`created ${g(e.name)} ${e.id}`),"label rm":c(({client:e,args:t})=>Ot(e,t),(e)=>`deleted ${g(e.name)}`),"state create":c(({client:e,args:t})=>It(e,t),(e)=>`created ${g(e.name)} ${e.group}`),"state update":c(({client:e,args:t})=>St(e,t),(e)=>`${g(e.name)} ${e.group}`),"state rm":c(({client:e,args:t})=>Tt(e,t),(e)=>`deleted ${g(e.name)}`)},qt=async(e,t,n,o,r)=>{let s=e===void 0?void 0:dn[e];if(s===void 0)throw new d(`No command "${e}". Run i-plane for the map.`);se(e,n),await s({client:t,args:n,config:o},r)};var Lt=(e,t=!1)=>async(n,o,r)=>{let{runPageContent:s}=await import("./chunks/page-content-3av0nfvc.js");await s(e,n,o,r,t)},Et=(e)=>async(t,n,o)=>{let r=await Ie(t,e?void 0:u(n.positionals[0],"a project"));x(await Dt(t,r),o,(s)=>Ht(s,e))},Ut=(e)=>async(t,n,o)=>{let r=u(n.positionals[e?0:1],"a page UUID or name"),s=await Ie(t,e?void 0:u(n.positionals[0],"a project")),a=Mt(await zt(t,s,r));if(a.losses.length)z(`Warning: ${a.losses.join("; ")}`);x(a,o,(l)=>l.markdown)},cn={...Object.fromEntries(["page outline","page read","page stamp","page create","page set","page insert","page rm"].flatMap((e)=>[[e,Lt(e)],[e.replace("page ","wiki "),Lt(e,!0)]])),pages:Et(!1),"wiki list":Et(!0),"page show":Ut(!1),"wiki show":Ut(!0)},Se=(e)=>e==="pages"||e.startsWith("page ")||e.startsWith("wiki "),Nt=async(e,t,n,o)=>{let r=cn[e];if(!r)throw new d(`Unknown page command "${e}".`);t.beginPageCommand?.();for(let s=0;s<2;s++)try{await r(t,n,o);return}catch(a){if(!(a instanceof Ft)||s>0)throw a}};var un="2.1.0",V,pn=(e,t)=>{let n=e===void 0?void 0:O(e);if(n===void 0){if(e===void 0||e==="help"||e==="version"||W(e).length>0){let s=[...t.flags.keys()].filter((a)=>!Gt.includes(a));if(s.length>0)throw new d(`${e??"i-plane"} does not take ${s.map((a)=>`--${a}`).join(", ")}.`)}return}V=e;let o=Wt(n),r=[...t.flags.keys()].filter((s)=>!o.has(s));if(r.length>0){let s=r.map((a)=>`--${a}`).join(", ");throw new d(`${n.name} does not take ${s}. Its flags are listed below.`)}},mn=(e,t)=>{let n=e.path.length===0?void 0:e.path.join(" "),o=n===void 0?void 0:O(n)?.name??n;if(pn(o,e),o!==void 0&&W(o).length>0){let r=W(o);if(h(e,"help"))return x({commands:r,globalOptions:q},t,(s)=>`${s.commands.map((a)=>ce({command:a},!1)).join(`
35
+ `);var jt=(e)=>{let t=u(e,"a project name");if(t.length>255||/[&+,:;$^}{*=?@#|'<>.()%!-]/.test(t))throw new d("Project name cannot contain special characters (including hyphens) or exceed 255 characters.");return t},bt=(e)=>{let t=e.trim().toUpperCase();if(!/^[A-Z][A-Z0-9]{0,11}$/.test(t))throw new d("--identifier expects 1–12 letters or digits, starting with a letter.");return t},xt=(e)=>{let t={};for(let[n,o]of[["intake","intake_view"],["cycles","cycle_view"],["modules","module_view"]])if(e.flags.has(n))t[o]=h(e,n);return t},Ct=async(e,t)=>{let n={...xt(t),name:jt(t.positionals.join(" ")),identifier:bt(P(t,"identifier"))},o=i(t,"description");if(o!==void 0)n.description=o;let r=n.intake_view===!0;if(r)delete n.intake_view;let s=await e.request("projects/",{method:"POST",body:n});if(!r)return s;try{return await e.request(`projects/${s.id}/`,{method:"PATCH",body:{intake_view:!0}})??{...s,intake_view:!0}}catch(a){return z(`${s.identifier} was created, but intake setup failed: ${a instanceof Error?a.message:String(a)}. Retry with i-plane project update ${s.id} --intake.`),s}},kt=async(e,t)=>{let n=u(t.positionals[0],"a project reference"),o={...xt(t)},r=i(t,"name");if(r!==void 0)o.name=jt(r);let s=i(t,"description");if(s!==void 0)o.description=s;let a=i(t,"identifier");if(a!==void 0)o.identifier=bt(a);I(o);let l=await y(e,n);return await e.request(`projects/${l.id}/`,{method:"PATCH",body:o})??{...l,...o}},Rt=async(e,t)=>{let n=await y(e,u(t.positionals[0],"a project reference"));return await e.request(`projects/${n.id}/archive/`,{method:"POST"}),n},G=(e)=>`${e.identifier} ${g(e.name)}`,_t=async(e,t)=>{let n={name:u(t.positionals.join(" "),"a label name")},o=P(t,"project"),r=i(t,"color");n.color=oe(r??"#808080");let s=i(t,"description");if(s!==void 0)n.description=s;let a=await y(e,o);return e.request(`projects/${a.id}/labels/`,{method:"POST",body:n})},At=(e)=>{let t={},n=i(e,"name");if(n!==void 0)t.name=u(n,"a state name");let o=i(e,"color");if(o!==void 0)t.color=oe(o);let r=i(e,"group");if(r!==void 0)t.group=R(r,M,"group");let s=i(e,"description");if(s!==void 0)t.description=s;return t},It=async(e,t)=>{let n=u(t.positionals.join(" "),"a state name"),o=oe(P(t,"color")),r=R(P(t,"group"),M,"group"),s={...At(t),name:n,color:o,group:r},a=await y(e,P(t,"project"));return e.request(`projects/${a.id}/states/`,{method:"POST",body:s})},St=async(e,t)=>{let n=u(t.positionals[0],"a state name or UUID"),o=At(t);I(o);let r=await y(e,P(t,"project")),s=b(await C(e,r.id),n,"state");return await e.request(`projects/${r.id}/states/${s.id}/`,{method:"PATCH",body:o})??{...s,...o}},Ae=(e)=>{if(!h(e,"yes"))throw new d("Deleting cannot be undone. Repeat with --yes.")},vt=async(e,t)=>{Ae(t);let n=await y(e,u(t.positionals[0],"a project reference"));return await e.request(`projects/${n.id}/`,{method:"DELETE"}),n},Ot=async(e,t)=>{Ae(t);let n=u(t.positionals[0],"a label name or UUID"),o=await y(e,P(t,"project")),r=await e.listAll(`projects/${o.id}/labels/`,{query:{fields:"id,name",per_page:100}}),s=b(r,n,"label");return await e.request(`projects/${o.id}/labels/${s.id}/`,{method:"DELETE"}),s},Tt=async(e,t)=>{Ae(t);let n=u(t.positionals[0],"a state name or UUID"),o=await y(e,P(t,"project")),r=b(await C(e,o.id),n,"state");return await e.request(`projects/${o.id}/states/${r.id}/`,{method:"DELETE"}),r};var c=(e,t)=>async(n,o)=>x(await e(n),o,t),dn={cycles:c(({client:e,args:t})=>je(e,t,"cycle"),Re),"cycle create":c(({client:e,args:t})=>xe(e,t,"cycle"),(e)=>`created ${N(e)}`),"cycle update":c(({client:e,args:t})=>ht(e,t),N),"cycle add":c(({client:e,args:t})=>Ce(e,t,"cycle"),_e),"cycle issues":c(({client:e,args:t})=>ke(e,t,"cycle"),ne),"cycle transfer":c(({client:e,args:t})=>Pt(e,t),$t),modules:c(({client:e,args:t})=>je(e,t,"module"),Re),"module create":c(({client:e,args:t})=>xe(e,t,"module"),(e)=>`created ${N(e)}`),"module add":c(({client:e,args:t})=>Ce(e,t,"module"),_e),"module issues":c(({client:e,args:t})=>ke(e,t,"module"),ne),"intake list":c(({client:e,args:t})=>tt(e,t),fe),"intake create":c(({client:e,args:t})=>nt(e,t),(e)=>`created ${ee(e)}`),"intake show":c(({client:e,args:t})=>rt(e,t),ee),"intake update":c(({client:e,args:t})=>ot(e,t),ee),"intake rm":c(({client:e,args:t})=>st(e,t),(e)=>`deleted intake entry ${e.ref}`),summary:c(({client:e,config:t})=>ze(e,t),He),projects:c(({client:e})=>J(e),Me),list:c(({client:e,args:t})=>it(e,t),ne),show:c(({client:e,args:t,config:n})=>dt(e,t,n.workspace.value,n.url.value),lt),create:c(({client:e,args:t})=>ct(e,t),(e)=>`created ${e.ref} ${e.name}`),update:c(({client:e,args:t})=>$e(e,t),(e)=>`${e.ref} ${e.name} (${e.state})`),done:c(({client:e,args:t})=>ut(e,t),(e)=>`${e.ref} ${e.state}`),delete:c(({client:e,args:t})=>pt(e,t),(e)=>e),comment:c(({client:e,args:t})=>mt(e,t),(e)=>e),comments:c(({client:e,args:t})=>Xe(e,t),X),search:c(({client:e,args:t})=>ft(e,t),yt),states:c(({client:e,args:t})=>Fe(e,t),Ne),labels:c(({client:e,args:t})=>Ge(e,t),We),members:c(({client:e})=>Ve(e),Be),whoami:c(({client:e})=>Ze(e),Je),"project create":c(({client:e,args:t})=>Ct(e,t),(e)=>`created ${G(e)}`),"project update":c(({client:e,args:t})=>kt(e,t),G),"project archive":c(({client:e,args:t})=>Rt(e,t),(e)=>`archived ${G(e)}`),"project rm":c(({client:e,args:t})=>vt(e,t),(e)=>`deleted ${G(e)}`),"label create":c(({client:e,args:t})=>_t(e,t),(e)=>`created ${g(e.name)} ${e.id}`),"label rm":c(({client:e,args:t})=>Ot(e,t),(e)=>`deleted ${g(e.name)}`),"state create":c(({client:e,args:t})=>It(e,t),(e)=>`created ${g(e.name)} ${e.group}`),"state update":c(({client:e,args:t})=>St(e,t),(e)=>`${g(e.name)} ${e.group}`),"state rm":c(({client:e,args:t})=>Tt(e,t),(e)=>`deleted ${g(e.name)}`)},qt=async(e,t,n,o,r)=>{let s=e===void 0?void 0:dn[e];if(s===void 0)throw new d(`No command "${e}". Run i-plane for the map.`);se(e,n),await s({client:t,args:n,config:o},r)};var Lt=(e,t=!1)=>async(n,o,r)=>{let{runPageContent:s}=await import("./chunks/page-content-a2hvapj1.js");await s(e,n,o,r,t)},Et=(e)=>async(t,n,o)=>{let r=await Ie(t,e?void 0:u(n.positionals[0],"a project"));x(await Dt(t,r),o,(s)=>Ht(s,e))},Ut=(e)=>async(t,n,o)=>{let r=u(n.positionals[e?0:1],"a page UUID or name"),s=await Ie(t,e?void 0:u(n.positionals[0],"a project")),a=Mt(await zt(t,s,r));if(a.losses.length)z(`Warning: ${a.losses.join("; ")}`);x(a,o,(l)=>l.markdown)},cn={...Object.fromEntries(["page outline","page read","page stamp","page create","page set","page insert","page rm"].flatMap((e)=>[[e,Lt(e)],[e.replace("page ","wiki "),Lt(e,!0)]])),pages:Et(!1),"wiki list":Et(!0),"page show":Ut(!1),"wiki show":Ut(!0)},Se=(e)=>e==="pages"||e.startsWith("page ")||e.startsWith("wiki "),Nt=async(e,t,n,o)=>{let r=cn[e];if(!r)throw new d(`Unknown page command "${e}".`);t.beginPageCommand?.();for(let s=0;s<2;s++)try{await r(t,n,o);return}catch(a){if(!(a instanceof Ft)||s>0)throw a}};var un="2.1.1",V,pn=(e,t)=>{let n=e===void 0?void 0:O(e);if(n===void 0){if(e===void 0||e==="help"||e==="version"||W(e).length>0){let s=[...t.flags.keys()].filter((a)=>!Gt.includes(a));if(s.length>0)throw new d(`${e??"i-plane"} does not take ${s.map((a)=>`--${a}`).join(", ")}.`)}return}V=e;let o=Wt(n),r=[...t.flags.keys()].filter((s)=>!o.has(s));if(r.length>0){let s=r.map((a)=>`--${a}`).join(", ");throw new d(`${n.name} does not take ${s}. Its flags are listed below.`)}},mn=(e,t)=>{let n=e.path.length===0?void 0:e.path.join(" "),o=n===void 0?void 0:O(n)?.name??n;if(pn(o,e),o!==void 0&&W(o).length>0){let r=W(o);if(h(e,"help"))return x({commands:r,globalOptions:q},t,(s)=>`${s.commands.map((a)=>ce({command:a},!1)).join(`
36
36
 
37
37
  `)}
38
38
 
package/docs/pages.md CHANGED
@@ -209,6 +209,12 @@ current core, runtime release and reader fingerprint. Results share the existing
209
209
  per-instance capability cache and `--refresh-pages`. Every custom-node write
210
210
  rechecks the runtime identity, so a rollback cannot reuse a previous positive claim.
211
211
 
212
+ The reader response uses its own API version: `readerApi: 1`. Product activation
213
+ protocol versions do not change that vocabulary; protocol 2 with reader API 1 is
214
+ supported. For older cores without `readerApi`, the CLI requires protocol 1.
215
+ An unknown reader API version produces an explicit refusal before conversion or
216
+ document changes. The reader inventory and runtime identity must still agree.
217
+
212
218
  An absent endpoint means refusal with exit code **1**, before conversion, page
213
219
  creation or document changes. `401`/`403` remain access errors; malformed inventory,
214
220
  service errors and disagreement between runtimes do not mean an absent feature.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i-plane",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "Compact Plane CLI for coding agents: tasks, projects, live pages, cycles, modules and intake.",
5
5
  "type": "module",
6
6
  "license": "MIT",