@justyork/repo-mind 0.7.2 → 0.8.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/.cursor/skills/repomind-docs/SKILL.md +160 -0
- package/.cursor/skills/repomind-docs/examples.md +429 -0
- package/.cursor/skills/repomind-docs/reference.md +209 -0
- package/.cursor/skills/repomind-docs/structure.md +132 -0
- package/dist/cli.js +17 -0
- package/dist/commands/install-skill.d.ts +9 -0
- package/dist/commands/install-skill.js +35 -0
- package/dist/commands/ui.js +5 -1
- package/dist/ui/auth.d.ts +21 -0
- package/dist/ui/auth.js +117 -0
- package/dist/ui/fs-operations.d.ts +1 -1
- package/dist/ui/fs-operations.js +36 -4
- package/dist/ui/fs-tree.d.ts +5 -4
- package/dist/ui/fs-tree.js +60 -56
- package/dist/ui/server.d.ts +2 -0
- package/dist/ui/server.js +63 -2
- package/package.json +3 -2
- package/ui/dist/assets/{arc-C1R_fyW-.js → arc-D8hdO1rw.js} +1 -1
- package/ui/dist/assets/{architectureDiagram-3BPJPVTR-CcuF3FYc.js → architectureDiagram-3BPJPVTR-DD8y2xkc.js} +1 -1
- package/ui/dist/assets/{blockDiagram-GPEHLZMM-BZJKe3Ei.js → blockDiagram-GPEHLZMM-CC_b0LTp.js} +1 -1
- package/ui/dist/assets/{c4Diagram-AAUBKEIU-D_0fRNGS.js → c4Diagram-AAUBKEIU-D0xWINWL.js} +1 -1
- package/ui/dist/assets/channel-BlZV_pp1.js +1 -0
- package/ui/dist/assets/{chunk-2J33WTMH-0LcH4vIA.js → chunk-2J33WTMH-BU6b81sJ.js} +1 -1
- package/ui/dist/assets/{chunk-4BX2VUAB-DU1h67AD.js → chunk-4BX2VUAB-DZAlHkZW.js} +1 -1
- package/ui/dist/assets/{chunk-55IACEB6-BCx7dyYV.js → chunk-55IACEB6-AiC0yewf.js} +1 -1
- package/ui/dist/assets/{chunk-727SXJPM-CRO5yOrB.js → chunk-727SXJPM-DThb082L.js} +1 -1
- package/ui/dist/assets/{chunk-AQP2D5EJ-BayHdr67.js → chunk-AQP2D5EJ-BPfxgjqM.js} +1 -1
- package/ui/dist/assets/{chunk-FMBD7UC4-CJemLien.js → chunk-FMBD7UC4-BPN8p0X8.js} +1 -1
- package/ui/dist/assets/{chunk-ND2GUHAM-B_z-tw44.js → chunk-ND2GUHAM-Fg3EXATp.js} +1 -1
- package/ui/dist/assets/{chunk-QZHKN3VN-D40rAh_S.js → chunk-QZHKN3VN-BfNeOxQX.js} +1 -1
- package/ui/dist/assets/classDiagram-4FO5ZUOK-DeRilEwX.js +1 -0
- package/ui/dist/assets/classDiagram-v2-Q7XG4LA2-DeRilEwX.js +1 -0
- package/ui/dist/assets/{cose-bilkent-S5V4N54A-Cqthtrrq.js → cose-bilkent-S5V4N54A-BajfXpNb.js} +1 -1
- package/ui/dist/assets/{dagre-BM42HDAG-CrxsyXEa.js → dagre-BM42HDAG-BOr2m0CZ.js} +1 -1
- package/ui/dist/assets/{diagram-2AECGRRQ-DTYA7Rrn.js → diagram-2AECGRRQ-0NMPI4vh.js} +1 -1
- package/ui/dist/assets/{diagram-5GNKFQAL-CXs7RV13.js → diagram-5GNKFQAL-CTuUvbHc.js} +1 -1
- package/ui/dist/assets/{diagram-KO2AKTUF-Bf8EeV_S.js → diagram-KO2AKTUF-BQMPycKH.js} +1 -1
- package/ui/dist/assets/{diagram-LMA3HP47-C2XWB0cI.js → diagram-LMA3HP47-0EqSTR8-.js} +1 -1
- package/ui/dist/assets/{diagram-OG6HWLK6-BNMXob9h.js → diagram-OG6HWLK6-Cn7vgxcz.js} +1 -1
- package/ui/dist/assets/{erDiagram-TEJ5UH35-CnSczOvb.js → erDiagram-TEJ5UH35-DCHJaPi9.js} +1 -1
- package/ui/dist/assets/{flowDiagram-I6XJVG4X-DwZBJ2fr.js → flowDiagram-I6XJVG4X-GcCMnaHc.js} +1 -1
- package/ui/dist/assets/{ganttDiagram-6RSMTGT7-rxwvD8xn.js → ganttDiagram-6RSMTGT7-4NzDSonj.js} +1 -1
- package/ui/dist/assets/{gitGraphDiagram-PVQCEYII-DjJPiQ2K.js → gitGraphDiagram-PVQCEYII-BXLfDhC_.js} +1 -1
- package/ui/dist/assets/graph-CxZcS9dt.js +2 -0
- package/ui/dist/assets/{infoDiagram-5YYISTIA-BHgtQpBK.js → infoDiagram-5YYISTIA-DLHHvQ1b.js} +1 -1
- package/ui/dist/assets/{ishikawaDiagram-YF4QCWOH-BZ38ndde.js → ishikawaDiagram-YF4QCWOH-BtqY11Uk.js} +1 -1
- package/ui/dist/assets/{journeyDiagram-JHISSGLW-CNaZf5VN.js → journeyDiagram-JHISSGLW-lBwhxW7E.js} +1 -1
- package/ui/dist/assets/{kanban-definition-UN3LZRKU-4h1Jmt_X.js → kanban-definition-UN3LZRKU-C4Q8frPQ.js} +1 -1
- package/ui/dist/assets/main-BuVawP8Y.js +269 -0
- package/ui/dist/assets/{mermaid.core-BZZdRyuR.js → mermaid.core-DdiilVI8.js} +4 -4
- package/ui/dist/assets/{mindmap-definition-RKZ34NQL-DG_NciLX.js → mindmap-definition-RKZ34NQL-CzSxcpUz.js} +1 -1
- package/ui/dist/assets/{pieDiagram-4H26LBE5-B9FyPCLY.js → pieDiagram-4H26LBE5-VQ1Y2aMu.js} +1 -1
- package/ui/dist/assets/{quadrantDiagram-W4KKPZXB-B89WFfQu.js → quadrantDiagram-W4KKPZXB-DHxOr_Bb.js} +1 -1
- package/ui/dist/assets/{requirementDiagram-4Y6WPE33-BYHKePgB.js → requirementDiagram-4Y6WPE33-IruBFJXP.js} +1 -1
- package/ui/dist/assets/{sankeyDiagram-5OEKKPKP-BW6YuBQM.js → sankeyDiagram-5OEKKPKP-J4usxNW5.js} +1 -1
- package/ui/dist/assets/{sequenceDiagram-3UESZ5HK-BnojqKwf.js → sequenceDiagram-3UESZ5HK-C6C-kFaI.js} +1 -1
- package/ui/dist/assets/{stateDiagram-AJRCARHV-C_x9t2o6.js → stateDiagram-AJRCARHV-CJsdQK0K.js} +1 -1
- package/ui/dist/assets/stateDiagram-v2-BHNVJYJU-CnDT2Btz.js +1 -0
- package/ui/dist/assets/theme-BoL8lq0C.css +1 -0
- package/ui/dist/assets/theme-PLJ1jPdr.js +21 -0
- package/ui/dist/assets/{timeline-definition-PNZ67QCA-CI8Ngfzv.js → timeline-definition-PNZ67QCA-DR-akfNv.js} +1 -1
- package/ui/dist/assets/{vennDiagram-CIIHVFJN-CPRKGc2P.js → vennDiagram-CIIHVFJN-HohIp6U7.js} +1 -1
- package/ui/dist/assets/{visual-editor-DUVPRlY3.js → visual-editor-DeCtedTT.js} +12 -12
- package/ui/dist/assets/{wardley-L42UT6IY-CZY42jFT.js → wardley-L42UT6IY-DI0ohKT0.js} +1 -1
- package/ui/dist/assets/{wardleyDiagram-YWT4CUSO-CGKyWKnw.js → wardleyDiagram-YWT4CUSO-C1s7Fzl1.js} +1 -1
- package/ui/dist/assets/{xychartDiagram-2RQKCTM6-Cq-onAc3.js → xychartDiagram-2RQKCTM6-BbPEPR4c.js} +1 -1
- package/ui/dist/graph.html +3 -3
- package/ui/dist/index.html +3 -3
- package/ui/dist/assets/channel-BlWnHbuq.js +0 -1
- package/ui/dist/assets/classDiagram-4FO5ZUOK-D3OdfPqd.js +0 -1
- package/ui/dist/assets/classDiagram-v2-Q7XG4LA2-D3OdfPqd.js +0 -1
- package/ui/dist/assets/graph-D_tIaE_I.js +0 -2
- package/ui/dist/assets/main-BeHrzLrS.js +0 -273
- package/ui/dist/assets/stateDiagram-v2-BHNVJYJU-CBZx8gKT.js +0 -1
- package/ui/dist/assets/theme-CFHWfrn1.css +0 -1
- package/ui/dist/assets/theme-DS1fBM5L.js +0 -1
package/ui/dist/assets/{journeyDiagram-JHISSGLW-CNaZf5VN.js → journeyDiagram-JHISSGLW-lBwhxW7E.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as gt}from"./chunk-FMBD7UC4-
|
|
1
|
+
import{g as gt}from"./chunk-FMBD7UC4-BPN8p0X8.js";import{a as mt,g as lt,h as xt,d as kt}from"./chunk-ND2GUHAM-Fg3EXATp.js";import{g as _t,s as vt,a as bt,b as wt,p as Tt,o as St,_ as s,c as R,d as $t,y as Mt}from"./mermaid.core-DdiilVI8.js";import{s as X}from"./transform-BwXaE9hv.js";import{d as it}from"./arc-D8hdO1rw.js";import"./main-BuVawP8Y.js";import"./theme-PLJ1jPdr.js";import"./editor-CTtDusro.js";var U=(function(){var t=s(function(h,r,n,l){for(n=n||{},l=h.length;l--;n[h[l]]=r);return n},"o"),e=[6,8,10,11,12,14,16,17,18],a=[1,9],f=[1,10],i=[1,11],u=[1,12],p=[1,13],o=[1,14],g={trace:s(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:s(function(r,n,l,y,d,c,v){var k=c.length-1;switch(d){case 1:return c[k-1];case 2:this.$=[];break;case 3:c[k-1].push(c[k]),this.$=c[k-1];break;case 4:case 5:this.$=c[k];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(c[k].substr(6)),this.$=c[k].substr(6);break;case 9:this.$=c[k].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=c[k].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(c[k].substr(8)),this.$=c[k].substr(8);break;case 13:y.addTask(c[k-1],c[k]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:a,12:f,14:i,16:u,17:p,18:o},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:a,12:f,14:i,16:u,17:p,18:o},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:s(function(r,n){if(n.recoverable)this.trace(r);else{var l=new Error(r);throw l.hash=n,l}},"parseError"),parse:s(function(r){var n=this,l=[0],y=[],d=[null],c=[],v=this.table,k="",C=0,Q=0,yt=2,D=1,dt=c.slice.call(arguments,1),_=Object.create(this.lexer),I={yy:{}};for(var O in this.yy)Object.prototype.hasOwnProperty.call(this.yy,O)&&(I.yy[O]=this.yy[O]);_.setInput(r,I.yy),I.yy.lexer=_,I.yy.parser=this,typeof _.yylloc>"u"&&(_.yylloc={});var Y=_.yylloc;c.push(Y);var ft=_.options&&_.options.ranges;typeof I.yy.parseError=="function"?this.parseError=I.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function pt(w){l.length=l.length-2*w,d.length=d.length-w,c.length=c.length-w}s(pt,"popStack");function tt(){var w;return w=y.pop()||_.lex()||D,typeof w!="number"&&(w instanceof Array&&(y=w,w=y.pop()),w=n.symbols_[w]||w),w}s(tt,"lex");for(var b,A,T,q,F={},N,M,et,z;;){if(A=l[l.length-1],this.defaultActions[A]?T=this.defaultActions[A]:((b===null||typeof b>"u")&&(b=tt()),T=v[A]&&v[A][b]),typeof T>"u"||!T.length||!T[0]){var H="";z=[];for(N in v[A])this.terminals_[N]&&N>yt&&z.push("'"+this.terminals_[N]+"'");_.showPosition?H="Parse error on line "+(C+1)+`:
|
|
2
2
|
`+_.showPosition()+`
|
|
3
3
|
Expecting `+z.join(", ")+", got '"+(this.terminals_[b]||b)+"'":H="Parse error on line "+(C+1)+": Unexpected "+(b==D?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(H,{text:_.match,token:this.terminals_[b]||b,line:_.yylineno,loc:Y,expected:z})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+A+", token: "+b);switch(T[0]){case 1:l.push(b),d.push(_.yytext),c.push(_.yylloc),l.push(T[1]),b=null,Q=_.yyleng,k=_.yytext,C=_.yylineno,Y=_.yylloc;break;case 2:if(M=this.productions_[T[1]][1],F.$=d[d.length-M],F._$={first_line:c[c.length-(M||1)].first_line,last_line:c[c.length-1].last_line,first_column:c[c.length-(M||1)].first_column,last_column:c[c.length-1].last_column},ft&&(F._$.range=[c[c.length-(M||1)].range[0],c[c.length-1].range[1]]),q=this.performAction.apply(F,[k,Q,C,I.yy,T[1],d,c].concat(dt)),typeof q<"u")return q;M&&(l=l.slice(0,-1*M*2),d=d.slice(0,-1*M),c=c.slice(0,-1*M)),l.push(this.productions_[T[1]][0]),d.push(F.$),c.push(F._$),et=v[l[l.length-2]][l[l.length-1]],l.push(et);break;case 3:return!0}}return!0},"parse")},m=(function(){var h={EOF:1,parseError:s(function(n,l){if(this.yy.parser)this.yy.parser.parseError(n,l);else throw new Error(n)},"parseError"),setInput:s(function(r,n){return this.yy=n||this.yy||{},this._input=r,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:s(function(){var r=this._input[0];this.yytext+=r,this.yyleng++,this.offset++,this.match+=r,this.matched+=r;var n=r.match(/(?:\r\n?|\n).*/g);return n?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),r},"input"),unput:s(function(r){var n=r.length,l=r.split(/(?:\r\n?|\n)/g);this._input=r+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-n),this.offset-=n;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),l.length-1&&(this.yylineno-=l.length-1);var d=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:l?(l.length===y.length?this.yylloc.first_column:0)+y[y.length-l.length].length-l[0].length:this.yylloc.first_column-n},this.options.ranges&&(this.yylloc.range=[d[0],d[0]+this.yyleng-n]),this.yyleng=this.yytext.length,this},"unput"),more:s(function(){return this._more=!0,this},"more"),reject:s(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
|
|
4
4
|
`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:s(function(r){this.unput(this.match.slice(r))},"less"),pastInput:s(function(){var r=this.matched.substr(0,this.matched.length-this.match.length);return(r.length>20?"...":"")+r.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:s(function(){var r=this.match;return r.length<20&&(r+=this._input.substr(0,20-r.length)),(r.substr(0,20)+(r.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:s(function(){var r=this.pastInput(),n=new Array(r.length+1).join("-");return r+this.upcomingInput()+`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as c,l as te,c as W,H as fe,ae as ye,af as be,ag as me,X as _e,F as Y,h as G,q as ke,J as Ee,U as Se,V as le,W as ce}from"./mermaid.core-
|
|
1
|
+
import{_ as c,l as te,c as W,H as fe,ae as ye,af as be,ag as me,X as _e,F as Y,h as G,q as ke,J as Ee,U as Se,V as le,W as ce}from"./mermaid.core-DdiilVI8.js";import{g as Ne}from"./chunk-FMBD7UC4-BPN8p0X8.js";import"./main-BuVawP8Y.js";import"./theme-PLJ1jPdr.js";import"./editor-CTtDusro.js";import"./transform-BwXaE9hv.js";var $=(function(){var t=c(function(_,s,n,a){for(n=n||{},a=_.length;a--;n[_[a]]=s);return n},"o"),g=[1,4],d=[1,13],r=[1,12],p=[1,15],k=[1,16],f=[1,20],h=[1,19],L=[6,7,8],C=[1,26],w=[1,24],N=[1,25],i=[6,7,11],U=[1,31],x=[6,7,11,24],P=[1,6,13,16,17,20,23],H=[1,35],M=[1,36],A=[1,6,7,11,13,16,17,20,23],j=[1,38],V={trace:c(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:c(function(s,n,a,o,u,e,B){var l=e.length-1;switch(u){case 6:case 7:return o;case 8:o.getLogger().trace("Stop NL ");break;case 9:o.getLogger().trace("Stop EOF ");break;case 11:o.getLogger().trace("Stop NL2 ");break;case 12:o.getLogger().trace("Stop EOF2 ");break;case 15:o.getLogger().info("Node: ",e[l-1].id),o.addNode(e[l-2].length,e[l-1].id,e[l-1].descr,e[l-1].type,e[l]);break;case 16:o.getLogger().info("Node: ",e[l].id),o.addNode(e[l-1].length,e[l].id,e[l].descr,e[l].type);break;case 17:o.getLogger().trace("Icon: ",e[l]),o.decorateNode({icon:e[l]});break;case 18:case 23:o.decorateNode({class:e[l]});break;case 19:o.getLogger().trace("SPACELIST");break;case 20:o.getLogger().trace("Node: ",e[l-1].id),o.addNode(0,e[l-1].id,e[l-1].descr,e[l-1].type,e[l]);break;case 21:o.getLogger().trace("Node: ",e[l].id),o.addNode(0,e[l].id,e[l].descr,e[l].type);break;case 22:o.decorateNode({icon:e[l]});break;case 27:o.getLogger().trace("node found ..",e[l-2]),this.$={id:e[l-1],descr:e[l-1],type:o.getType(e[l-2],e[l])};break;case 28:this.$={id:e[l],descr:e[l],type:0};break;case 29:o.getLogger().trace("node found ..",e[l-3]),this.$={id:e[l-3],descr:e[l-1],type:o.getType(e[l-2],e[l])};break;case 30:this.$=e[l-1]+e[l];break;case 31:this.$=e[l];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:g},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:g},{6:d,7:[1,10],9:9,12:11,13:r,14:14,16:p,17:k,18:17,19:18,20:f,23:h},t(L,[2,3]),{1:[2,2]},t(L,[2,4]),t(L,[2,5]),{1:[2,6],6:d,12:21,13:r,14:14,16:p,17:k,18:17,19:18,20:f,23:h},{6:d,9:22,12:11,13:r,14:14,16:p,17:k,18:17,19:18,20:f,23:h},{6:C,7:w,10:23,11:N},t(i,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:f,23:h}),t(i,[2,19]),t(i,[2,21],{15:30,24:U}),t(i,[2,22]),t(i,[2,23]),t(x,[2,25]),t(x,[2,26]),t(x,[2,28],{20:[1,32]}),{21:[1,33]},{6:C,7:w,10:34,11:N},{1:[2,7],6:d,12:21,13:r,14:14,16:p,17:k,18:17,19:18,20:f,23:h},t(P,[2,14],{7:H,11:M}),t(A,[2,8]),t(A,[2,9]),t(A,[2,10]),t(i,[2,16],{15:37,24:U}),t(i,[2,17]),t(i,[2,18]),t(i,[2,20],{24:j}),t(x,[2,31]),{21:[1,39]},{22:[1,40]},t(P,[2,13],{7:H,11:M}),t(A,[2,11]),t(A,[2,12]),t(i,[2,15],{24:j}),t(x,[2,30]),{22:[1,41]},t(x,[2,27]),t(x,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:c(function(s,n){if(n.recoverable)this.trace(s);else{var a=new Error(s);throw a.hash=n,a}},"parseError"),parse:c(function(s){var n=this,a=[0],o=[],u=[null],e=[],B=this.table,l="",z=0,ie=0,ue=2,re=1,ge=e.slice.call(arguments,1),m=Object.create(this.lexer),T={yy:{}};for(var J in this.yy)Object.prototype.hasOwnProperty.call(this.yy,J)&&(T.yy[J]=this.yy[J]);m.setInput(s,T.yy),T.yy.lexer=m,T.yy.parser=this,typeof m.yylloc>"u"&&(m.yylloc={});var q=m.yylloc;e.push(q);var de=m.options&&m.options.ranges;typeof T.yy.parseError=="function"?this.parseError=T.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function pe(S){a.length=a.length-2*S,u.length=u.length-S,e.length=e.length-S}c(pe,"popStack");function ae(){var S;return S=o.pop()||m.lex()||re,typeof S!="number"&&(S instanceof Array&&(o=S,S=o.pop()),S=n.symbols_[S]||S),S}c(ae,"lex");for(var E,R,v,Q,F={},X,I,oe,K;;){if(R=a[a.length-1],this.defaultActions[R]?v=this.defaultActions[R]:((E===null||typeof E>"u")&&(E=ae()),v=B[R]&&B[R][E]),typeof v>"u"||!v.length||!v[0]){var Z="";K=[];for(X in B[R])this.terminals_[X]&&X>ue&&K.push("'"+this.terminals_[X]+"'");m.showPosition?Z="Parse error on line "+(z+1)+`:
|
|
2
2
|
`+m.showPosition()+`
|
|
3
3
|
Expecting `+K.join(", ")+", got '"+(this.terminals_[E]||E)+"'":Z="Parse error on line "+(z+1)+": Unexpected "+(E==re?"end of input":"'"+(this.terminals_[E]||E)+"'"),this.parseError(Z,{text:m.match,token:this.terminals_[E]||E,line:m.yylineno,loc:q,expected:K})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+R+", token: "+E);switch(v[0]){case 1:a.push(E),u.push(m.yytext),e.push(m.yylloc),a.push(v[1]),E=null,ie=m.yyleng,l=m.yytext,z=m.yylineno,q=m.yylloc;break;case 2:if(I=this.productions_[v[1]][1],F.$=u[u.length-I],F._$={first_line:e[e.length-(I||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(I||1)].first_column,last_column:e[e.length-1].last_column},de&&(F._$.range=[e[e.length-(I||1)].range[0],e[e.length-1].range[1]]),Q=this.performAction.apply(F,[l,ie,z,T.yy,v[1],u,e].concat(ge)),typeof Q<"u")return Q;I&&(a=a.slice(0,-1*I*2),u=u.slice(0,-1*I),e=e.slice(0,-1*I)),a.push(this.productions_[v[1]][0]),u.push(F.$),e.push(F._$),oe=B[a[a.length-2]][a[a.length-1]],a.push(oe);break;case 3:return!0}}return!0},"parse")},y=(function(){var _={EOF:1,parseError:c(function(n,a){if(this.yy.parser)this.yy.parser.parseError(n,a);else throw new Error(n)},"parseError"),setInput:c(function(s,n){return this.yy=n||this.yy||{},this._input=s,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:c(function(){var s=this._input[0];this.yytext+=s,this.yyleng++,this.offset++,this.match+=s,this.matched+=s;var n=s.match(/(?:\r\n?|\n).*/g);return n?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),s},"input"),unput:c(function(s){var n=s.length,a=s.split(/(?:\r\n?|\n)/g);this._input=s+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-n),this.offset-=n;var o=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),a.length-1&&(this.yylineno-=a.length-1);var u=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:a?(a.length===o.length?this.yylloc.first_column:0)+o[o.length-a.length].length-a[0].length:this.yylloc.first_column-n},this.options.ranges&&(this.yylloc.range=[u[0],u[0]+this.yyleng-n]),this.yyleng=this.yytext.length,this},"unput"),more:c(function(){return this._more=!0,this},"more"),reject:c(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
|
|
4
4
|
`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:c(function(s){this.unput(this.match.slice(s))},"less"),pastInput:c(function(){var s=this.matched.substr(0,this.matched.length-this.match.length);return(s.length>20?"...":"")+s.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:c(function(){var s=this.match;return s.length<20&&(s+=this._input.substr(0,20-s.length)),(s.substr(0,20)+(s.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:c(function(){var s=this.pastInput(),n=new Array(s.length+1).join("-");return s+this.upcomingInput()+`
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/visual-editor-DeCtedTT.js","assets/editor-CTtDusro.js","assets/theme-PLJ1jPdr.js","assets/theme-BoL8lq0C.css","assets/mermaid.core-DdiilVI8.js","assets/transform-BwXaE9hv.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{p as qt,s as Dt,e as xt,g as Mt,a as Rt,l as X,b as At,c as Ht,d as fe,f as Nt,u as It,h as Ft,i as Wt,o as tt,j as _t,m as Ut,k as Bt,n as Ot,q as jt,r as Ie,t as Kt,v as zt,w as Gt,x as Vt,y as Jt,z as j,A as Fe,B as Q,C as Xt}from"./theme-PLJ1jPdr.js";import{m as nt}from"./editor-CTtDusro.js";const Yt={"wiki-page":"Wiki",adr:"ADR","feature-spec":"Feature specs","glossary-term":"Glossary","open-question":"Open questions","agent-instruction":"Agent instructions"},We="folder:";function he(e){if(e.startsWith(We)){const t=e.slice(We.length);return t==="__root__"?"General":t.split(/[-_/]/).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ")}return Yt[e]??e}function Qt(e,t){var S,m,$,L;e.className="workspace-main workspace-dashboard",e.innerHTML=`
|
|
3
|
+
<div class="dashboard-header">
|
|
4
|
+
<h1 class="doc-title">Health & publish</h1>
|
|
5
|
+
<div class="workspace-actions">
|
|
6
|
+
<button type="button" id="dash-export" class="btn-ghost">Export agents.md</button>
|
|
7
|
+
<button type="button" id="dash-refresh" class="btn-ghost">Refresh</button>
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
<div id="dash-check" class="dashboard-section"></div>
|
|
11
|
+
<div id="dash-links" class="dashboard-section"></div>
|
|
12
|
+
<div class="dashboard-section">
|
|
13
|
+
<h2>Prepare docs</h2>
|
|
14
|
+
<p class="dashboard-hint">Markdown files without RepoMind frontmatter. Add frontmatter to index them for MCP and the catalog.</p>
|
|
15
|
+
<div class="dashboard-actions">
|
|
16
|
+
<button type="button" id="dash-prepare-all" class="btn-primary btn-sm">Prepare all</button>
|
|
17
|
+
<button type="button" id="dash-sync-links" class="btn-ghost btn-sm">Sync all links</button>
|
|
18
|
+
</div>
|
|
19
|
+
<ul id="dash-unprepared" class="queue-list"></ul>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="dashboard-section">
|
|
22
|
+
<h2>Publish queue</h2>
|
|
23
|
+
<ul id="dash-queue" class="queue-list"></ul>
|
|
24
|
+
</div>
|
|
25
|
+
`;const n=e.querySelector("#dash-check"),r=e.querySelector("#dash-links"),o=e.querySelector("#dash-unprepared"),l=e.querySelector("#dash-queue");function d(i){const c=i.ok?"check-ok":"check-fail",s=i.ok?"All checks passed":`${i.violations.length} issue(s)`;let a=`
|
|
26
|
+
<h2>Schema check</h2>
|
|
27
|
+
<p class="check-status ${c}">${s}</p>
|
|
28
|
+
`;if(i.violations.length>0){a+='<ul class="violation-list">';for(const u of i.violations)a+=`<li><code>${I(u.path)}</code> — ${I(u.message)}</li>`;a+="</ul>"}if(i.warnings.length>0){a+='<h3 class="warnings-title">Warnings</h3><ul class="warning-list">';for(const u of i.warnings)a+=`<li>${I(u)}</li>`;a+="</ul>"}n.innerHTML=a}function g(i){let c=`
|
|
29
|
+
<h2>Link health</h2>
|
|
30
|
+
<div class="link-health-stats">
|
|
31
|
+
<div class="link-health-stat"><span class="link-health-value">${i.orphanCount}</span> orphans</div>
|
|
32
|
+
<div class="link-health-stat"><span class="link-health-value">${i.brokenCount}</span> broken</div>
|
|
33
|
+
<div class="link-health-stat"><span class="link-health-value">${i.oneWayCount}</span> one-way</div>
|
|
34
|
+
</div>
|
|
35
|
+
`;if(i.brokenTargets.length>0){c+='<h3 class="warnings-title">Broken targets</h3><ul class="warning-list">';for(const s of i.brokenTargets)c+=`<li><code>${I(s)}</code></li>`;c+="</ul>"}if(i.orphanSlugs.length>0){c+='<h3 class="warnings-title">Orphan pages</h3><ul class="warning-list">';for(const s of i.orphanSlugs)c+=`<li><code>${I(s)}</code></li>`;c+="</ul>"}r.innerHTML=c}function v(i){var c;if(o.innerHTML="",i.length===0){o.innerHTML='<li class="placeholder">All docs have frontmatter</li>';return}for(const s of i){const a=document.createElement("li");a.className="queue-item",a.innerHTML=`
|
|
36
|
+
<div class="queue-main">
|
|
37
|
+
<div class="queue-title">${I(s.relativePath)}</div>
|
|
38
|
+
<div class="meta">${I(s.suggestedType)} · slug: ${I(s.suggestedSlug)}</div>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="queue-actions">
|
|
41
|
+
<button type="button" class="btn-primary btn-sm" data-action="prepare">Add frontmatter</button>
|
|
42
|
+
</div>
|
|
43
|
+
`,(c=a.querySelector('[data-action="prepare"]'))==null||c.addEventListener("click",()=>{Ht(s.relativePath,s.suggestedType).then(({result:u})=>{t.onNotify(`Prepared: ${u.slug}`),f()}).catch(u=>{t.onNotify(u instanceof Error?u.message:"Prepare failed",!0)})}),o.appendChild(a)}}function p(i){var c,s;if(l.innerHTML="",i.length===0){l.innerHTML='<li class="placeholder">No drafts in queue</li>';return}for(const a of i){const u=document.createElement("li");u.className="queue-item",u.innerHTML=`
|
|
44
|
+
<div class="queue-main">
|
|
45
|
+
<div class="queue-title">${I(a.title||a.slug)}</div>
|
|
46
|
+
<div class="meta">${I(a.slug)} · ${I(a.type)}</div>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="queue-actions">
|
|
49
|
+
<button type="button" class="btn-ghost btn-sm" data-action="edit">Edit</button>
|
|
50
|
+
<button type="button" class="btn-primary btn-sm" data-action="publish">Publish</button>
|
|
51
|
+
</div>
|
|
52
|
+
`,(c=u.querySelector('[data-action="edit"]'))==null||c.addEventListener("click",()=>{t.onOpenDraft(a)}),(s=u.querySelector('[data-action="publish"]'))==null||s.addEventListener("click",()=>{fe(a.id).then(({result:w})=>{t.onPublished(w.path),f()}).catch(w=>{t.onNotify(w instanceof Error?w.message:"Publish failed",!0)})}),l.appendChild(u)}}async function f(){try{const[i,c,{drafts:s},{files:a}]=await Promise.all([Mt(),Rt(),X(),At()]);d(i),g(c),v(a),p(s)}catch(i){n.innerHTML=`<p class="check-status check-fail">${I(i instanceof Error?i.message:"Failed to load")}</p>`}}return(S=e.querySelector("#dash-refresh"))==null||S.addEventListener("click",()=>{f()}),(m=e.querySelector("#dash-prepare-all"))==null||m.addEventListener("click",()=>{qt().then(({result:i})=>{t.onNotify(`Prepared ${i.prepared.length} file(s)`),f()}).catch(i=>{t.onNotify(i instanceof Error?i.message:"Prepare all failed",!0)})}),($=e.querySelector("#dash-sync-links"))==null||$.addEventListener("click",()=>{Dt().then(({result:i})=>{const c=i.files.filter(s=>s.changed).length;t.onNotify(`Synced links in ${c} file(s)`),f()}).catch(i=>{t.onNotify(i instanceof Error?i.message:"Sync links failed",!0)})}),(L=e.querySelector("#dash-export"))==null||L.addEventListener("click",()=>{xt().then(({path:i})=>{t.onNotify(`Exported ${i}`)}).catch(i=>{t.onNotify(i instanceof Error?i.message:"Export failed",!0)})}),f(),{refresh:f}}function I(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}const rt="repomind-page-info-hidden";function x(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function oe(){try{const e=localStorage.getItem(rt);return e===null?!0:e==="true"}catch{return!0}}function st(e){try{localStorage.setItem(rt,e?"true":"false")}catch{}}function Zt(e){return e.map((t,n)=>{const r=n>0?'<span class="crumb-sep">›</span>':"";return t.current?`${r}<span class="crumb current">${x(t.label)}</span>`:t.crumbId?`${r}<button type="button" class="crumb" data-crumb="${x(t.crumbId)}">${x(t.label)}</button>`:`${r}<span class="crumb">${x(t.label)}</span>`}).join("")}function me(e,t){const n=t.focusMode??oe();e.className=t.rootClass??"workspace-main",e.innerHTML=`
|
|
53
|
+
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
54
|
+
${Zt(t.breadcrumbs)}
|
|
55
|
+
</nav>
|
|
56
|
+
<div class="page-layout${n?" page-layout--focus":""}">
|
|
57
|
+
<article class="page-content">
|
|
58
|
+
<header class="page-header">
|
|
59
|
+
<div class="page-title-slot">${t.titleHtml}</div>
|
|
60
|
+
<div class="workspace-actions">${t.actionsHtml}</div>
|
|
61
|
+
</header>
|
|
62
|
+
<div class="page-body-slot">${t.mainHtml}</div>
|
|
63
|
+
</article>
|
|
64
|
+
<aside class="page-info">${t.railHtml}</aside>
|
|
65
|
+
</div>
|
|
66
|
+
`;const r=e.querySelector(".page-layout");return{pageLayout:r,bodySlot:e.querySelector(".page-body-slot"),railSlot:e.querySelector(".page-info"),setFocusMode(o){r.classList.toggle("page-layout--focus",o),st(o)}}}function ve(e,t,n){const r=e.querySelector("#toggle-focus"),o=e.querySelector(".page-layout");!r||!o||(o.classList.toggle("page-layout--focus",t),r.setAttribute("aria-pressed",String(t)),r.textContent=t?"Show info":"Hide info",r.addEventListener("click",()=>{const l=!o.classList.contains("page-layout--focus");o.classList.toggle("page-layout--focus",l),st(l),r.setAttribute("aria-pressed",String(l)),r.textContent=l?"Show info":"Hide info"}))}function en(e,t){e.querySelectorAll(".breadcrumb [data-crumb]").forEach(n=>{n.addEventListener("click",()=>{const r=n.dataset.crumb;r&&t[r]&&t[r]()})})}const at=/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g;function ot(e,t){const n=e.trim(),r=((t==null?void 0:t.trim())||n).trim();return{display:n,slug:r}}function pr(e,t){const n=e.trim(),r=(t??n).trim();return r===n?`[[${n}]]`:`[[${n}|${r}]]`}function tn(e){const t=[];for(const n of e.matchAll(at)){const{slug:r}=ot(n[1]??"",n[2]);r&&t.push(r)}return t}function nn(e){return tn(e)}function rn(e,t){const n=t.find(l=>l.slug===e);if(n)return n.slug;const r=e.toLowerCase(),o=t.find(l=>l.title.toLowerCase()===r);return(o==null?void 0:o.slug)??null}function sn(e,t,n){const r=new Set(t),o=[];for(const l of nn(e)){const d=rn(l,n);!d||r.has(d)||o.includes(d)||o.push(d)}return o}function an(e,t,n){const r=e.toLowerCase();if(!r)return 1;const o=t.toLowerCase(),l=n.toLowerCase();return o.startsWith(r)||l.startsWith(r)?3:o.includes(r)||l.includes(r)?2:0}function on(e,t,n=12){return t.map(r=>({doc:r,score:an(e,r.slug,r.title)})).filter(r=>r.score>0).sort((r,o)=>o.score-r.score||r.doc.slug.localeCompare(o.doc.slug)).slice(0,n).map(r=>r.doc)}const ln=["adr","feature-spec","glossary-term","open-question","agent-instruction","wiki-page"],dn=["draft","proposed","accepted","superseded"];function it(e){return`
|
|
67
|
+
<h2 class="page-info-title">Page properties</h2>
|
|
68
|
+
<div class="workspace-badges editor-badges">
|
|
69
|
+
<span class="badge badge-draft">draft</span>
|
|
70
|
+
${e.forkedFrom?`<span class="badge">fork: ${x(e.forkedFrom)}</span>`:""}
|
|
71
|
+
</div>
|
|
72
|
+
<div class="props-section">
|
|
73
|
+
<div class="props-label">Status</div>
|
|
74
|
+
<div class="props-chip-row">
|
|
75
|
+
<button type="button" id="ed-status-chip" class="status-chip props-chip-trigger" aria-haspopup="listbox"></button>
|
|
76
|
+
<div id="ed-status-menu" class="props-dropdown hidden" role="listbox"></div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
<div class="props-section">
|
|
80
|
+
<div class="props-label">Type</div>
|
|
81
|
+
<div class="props-chip-row">
|
|
82
|
+
<button type="button" id="ed-type-chip" class="props-chip props-chip-trigger" aria-haspopup="listbox"></button>
|
|
83
|
+
<div id="ed-type-menu" class="props-dropdown hidden" role="listbox"></div>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="props-hint" id="ed-catalog-hint"></div>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="props-section">
|
|
88
|
+
<div class="props-label">Slug</div>
|
|
89
|
+
<input id="ed-slug" class="props-slug-input" spellcheck="false" />
|
|
90
|
+
<div class="props-hint props-hint-slug hidden" id="ed-slug-hint"></div>
|
|
91
|
+
</div>
|
|
92
|
+
<div class="props-section">
|
|
93
|
+
<div class="props-label">Tags</div>
|
|
94
|
+
<div id="ed-tags-chips" class="props-chip-list"></div>
|
|
95
|
+
<input id="ed-tags-input" class="props-add-input" placeholder="Add tag…" />
|
|
96
|
+
</div>
|
|
97
|
+
<div class="props-section">
|
|
98
|
+
<div class="props-label">Related</div>
|
|
99
|
+
<div id="ed-related-chips" class="props-chip-list"></div>
|
|
100
|
+
<input id="ed-related-input" class="props-add-input" placeholder="Add related slug…" autocomplete="off" />
|
|
101
|
+
<div id="ed-related-menu" class="props-dropdown hidden" role="listbox"></div>
|
|
102
|
+
</div>
|
|
103
|
+
`}function cn(e,t,n,r){const o=e.querySelector("#ed-slug"),l=e.querySelector("#ed-slug-hint"),d=e.querySelector("#ed-status-chip"),g=e.querySelector("#ed-status-menu"),v=e.querySelector("#ed-type-chip"),p=e.querySelector("#ed-type-menu"),f=e.querySelector("#ed-catalog-hint"),S=e.querySelector("#ed-tags-chips"),m=e.querySelector("#ed-tags-input"),$=e.querySelector("#ed-related-chips"),L=e.querySelector("#ed-related-input"),i=e.querySelector("#ed-related-menu");let c=[...t.tags],s=[...t.related],a=t.status,u=t.type;o.value=t.slug,t.forkedFrom&&(o.readOnly=!0,o.title="Slug is fixed for edits of an existing published page",l.textContent=`Locked while editing published page (${t.forkedFrom})`,l.classList.remove("hidden")),q(),M(),P(),D();function w(){r()}function q(){d.textContent=a,d.className=`status-chip props-chip-trigger status-${a}`,g.innerHTML=dn.map(h=>`<button type="button" class="props-dropdown-item" data-value="${h}" role="option">${h}</button>`).join("")}function M(){v.textContent=u,f.textContent=he(u),p.innerHTML=ln.map(h=>`<button type="button" class="props-dropdown-item" data-value="${h}" role="option">${h}</button>`).join("")}function P(){S.innerHTML=c.map(h=>`<span class="tag-chip props-removable-chip">${x(h)}<button type="button" class="chip-remove" data-tag="${x(h)}" aria-label="Remove tag">×</button></span>`).join(""),S.querySelectorAll(".chip-remove").forEach(h=>{h.addEventListener("click",()=>{const E=h.dataset.tag;c=c.filter(T=>T!==E),P(),w()})})}function D(){$.innerHTML=s.map(h=>`<span class="related-chip props-removable-chip">${x(h)}<button type="button" class="chip-remove" data-slug="${x(h)}" aria-label="Remove related">×</button></span>`).join(""),$.querySelectorAll(".chip-remove").forEach(h=>{h.addEventListener("click",()=>{const E=h.dataset.slug;s=s.filter(T=>T!==E),D(),w()})})}function y(){g.classList.add("hidden"),p.classList.add("hidden"),i.classList.add("hidden")}d.addEventListener("click",()=>{g.classList.toggle("hidden")||(p.classList.add("hidden"),i.classList.add("hidden"))}),g.addEventListener("click",h=>{const E=h.target.closest("[data-value]");E&&(a=E.dataset.value??a,q(),g.classList.add("hidden"),w())}),v.addEventListener("click",()=>{p.classList.toggle("hidden")||(g.classList.add("hidden"),i.classList.add("hidden"))}),p.addEventListener("click",h=>{const E=h.target.closest("[data-value]");E&&(u=E.dataset.value??u,M(),p.classList.add("hidden"),w())}),o.addEventListener("input",w),m.addEventListener("keydown",h=>{if(h.key!=="Enter"&&h.key!==",")return;h.preventDefault();const E=m.value.trim().replace(/,$/,"");if(!E||c.includes(E)){m.value="";return}c.push(E),m.value="",P(),w()});function k(h){const E=on(h,n).filter(T=>!s.includes(T.slug));if(E.length===0){i.classList.add("hidden");return}i.innerHTML=E.map(T=>`<button type="button" class="props-dropdown-item" data-slug="${x(T.slug)}" role="option">
|
|
104
|
+
<span class="wikilink-option-slug">${x(T.slug)}</span>
|
|
105
|
+
<span class="wikilink-option-title">${x(T.title)}</span>
|
|
106
|
+
</button>`).join(""),i.classList.remove("hidden")}return L.addEventListener("input",()=>{k(L.value.trim())}),L.addEventListener("keydown",h=>{if(h.key==="Enter"){h.preventDefault();const E=L.value.trim();E&&!s.includes(E)&&(s.push(E),L.value="",D(),i.classList.add("hidden"),w())}}),i.addEventListener("mousedown",h=>{h.preventDefault();const E=h.target.closest("[data-slug]");if(!E)return;const T=E.dataset.slug??"";T&&!s.includes(T)&&(s.push(T),L.value="",D(),i.classList.add("hidden"),w())}),document.addEventListener("click",h=>{const E=h.target;!d.contains(E)&&!g.contains(E)&&!v.contains(E)&&!p.contains(E)&&!L.contains(E)&&!i.contains(E)&&y()}),{getState:()=>({slug:o.value.trim(),type:u,status:a,tags:[...c],related:[...s]}),setRelated(h){s=[...new Set(h)],D(),w()}}}const un="modulepreload",pn=function(e){return"/"+e},_e={},lt=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){let d=function(p){return Promise.all(p.map(f=>Promise.resolve(f).then(S=>({status:"fulfilled",value:S}),S=>({status:"rejected",reason:S}))))};document.getElementsByTagName("link");const g=document.querySelector("meta[property=csp-nonce]"),v=(g==null?void 0:g.nonce)||(g==null?void 0:g.getAttribute("nonce"));o=d(n.map(p=>{if(p=pn(p),p in _e)return;_e[p]=!0;const f=p.endsWith(".css"),S=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${p}"]${S}`))return;const m=document.createElement("link");if(m.rel=f?"stylesheet":un,f||(m.as="script"),m.crossOrigin="",m.href=p,v&&m.setAttribute("nonce",v),document.head.appendChild(m),f)return new Promise(($,L)=>{m.addEventListener("load",$),m.addEventListener("error",()=>L(new Error(`Unable to preload CSS for ${p}`)))})}))}function l(d){const g=new Event("vite:preloadError",{cancelable:!0});if(g.payload=d,window.dispatchEvent(g),!g.defaultPrevented)throw d}return o.then(d=>{for(const g of d||[])g.status==="rejected"&&l(g.reason);return t().catch(l)})};let U=null,V=null;function dt(e,t,n,r,o=[]){var ke,$e,Pe,Ce,Te,qe,De,xe,Me,Re,Ae,He;const l=o.map(b=>({slug:b.slug,title:b.title}));let d=null,g=n.body;const v=e.querySelector("#ed-title"),p=e.querySelector("#ed-save-status"),f=t.bodySlot.querySelector("#ed-visual-canvas"),S=document.createElement("div");S.id="publish-modal",S.className="modal hidden",S.innerHTML=`
|
|
107
|
+
<div class="modal-card modal-card-wide">
|
|
108
|
+
<p>Publish to git as markdown?</p>
|
|
109
|
+
<code id="publish-target"></code>
|
|
110
|
+
<pre id="publish-diff" class="diff-preview"></pre>
|
|
111
|
+
<div id="publish-related" class="publish-related hidden">
|
|
112
|
+
<p id="publish-related-prompt"></p>
|
|
113
|
+
<ul id="publish-related-list" class="publish-related-list"></ul>
|
|
114
|
+
<div class="editor-actions">
|
|
115
|
+
<button type="button" id="publish-related-apply" class="btn-primary">Add to related</button>
|
|
116
|
+
<button type="button" id="publish-related-skip" class="btn-ghost">Skip</button>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
<div class="editor-actions">
|
|
120
|
+
<button type="button" id="publish-confirm" class="btn-primary">Confirm</button>
|
|
121
|
+
<button type="button" id="publish-cancel" class="btn-ghost">Cancel</button>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
`,e.appendChild(S);const m=document.createElement("div");m.id="view-md-modal",m.className="modal hidden",m.innerHTML=`
|
|
125
|
+
<div class="modal-card modal-card-wide">
|
|
126
|
+
<h3 class="modal-title">Markdown source</h3>
|
|
127
|
+
<pre id="view-md-content" class="md-source"></pre>
|
|
128
|
+
<div class="editor-actions">
|
|
129
|
+
<button type="button" id="view-md-copy" class="btn-primary">Copy</button>
|
|
130
|
+
<button type="button" id="view-md-close" class="btn-ghost">Close</button>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
`,e.appendChild(m);const $=e.querySelector("#ed-publish-menu");v.value=n.title;const L=cn(t.railSlot,{slug:n.slug,type:n.type,status:n.status,tags:n.tags,related:n.related},l,()=>w());lt(async()=>{const{mountVisualEditor:b}=await import("./visual-editor-DeCtedTT.js");return{mountVisualEditor:b}},__vite__mapDeps([0,1,2,3])).then(({mountVisualEditor:b})=>{d=b(f,{initialMarkdown:n.body,docCandidates:l,onBodyChange:()=>w(),onError:r.onError})});let i=[];function c(){return(d==null?void 0:d.getMarkdownBody())??g}function s(){const b=L.getState();return{title:v.value,slug:b.slug,type:b.type,status:b.status,tags:b.tags,related:b.related,body:c()}}function a(b){p.textContent=b}async function u(){a("Saving…");const b=s();g=b.body,await It(n.id,b),a("Saved")}function w(){U&&clearTimeout(U),U=setTimeout(()=>{U=null,V=u().catch(b=>{a(""),r.onError(b instanceof Error?b.message:"Autosave failed")})},800)}async function q(){U&&(clearTimeout(U),U=null,V=u().catch(b=>{throw a(""),r.onError(b instanceof Error?b.message:"Autosave failed"),b})),V&&(await V,V=null)}v.addEventListener("input",()=>w()),v.addEventListener("change",()=>w());function M(){const b=e.querySelector("#publish-related"),R=e.querySelector("#publish-related-prompt"),O=e.querySelector("#publish-related-list"),F=L.getState();if(i=sn(c(),F.related,l),i.length===0){b.classList.add("hidden");return}R.textContent=`Add ${i.length} body link(s) to related?`,O.innerHTML=i.map(le=>{var Ne;const Ct=((Ne=l.find(Tt=>Tt.slug===le))==null?void 0:Ne.title)??le;return`<li><code>${x(le)}</code> — ${x(Ct)}</li>`}).join(""),b.classList.remove("hidden")}function P(){var R;if(i.length===0)return;const b=L.getState();L.setRelated([...new Set([...b.related,...i])]),i=[],(R=e.querySelector("#publish-related"))==null||R.classList.add("hidden")}(ke=e.querySelector("#publish-related-apply"))==null||ke.addEventListener("click",()=>{P()}),($e=e.querySelector("#publish-related-skip"))==null||$e.addEventListener("click",()=>{var b;i=[],(b=e.querySelector("#publish-related"))==null||b.classList.add("hidden")});let D=null,y=null;function k(){S.classList.add("hidden"),D&&(document.removeEventListener("keydown",D),D=null)}function h(){S.classList.remove("hidden"),D||(D=b=>{b.key==="Escape"&&k()},document.addEventListener("keydown",D))}function E(){m.classList.add("hidden")}function T(){const b=m.querySelector("#view-md-content");b.textContent=c(),m.classList.remove("hidden")}async function C(){await q(),h(),M();const b=e.querySelector("#publish-target"),R=e.querySelector("#publish-diff"),O=L.getState();b.textContent=`docs/.../${O.slug}.md`,R.textContent="Loading diff…";try{const F=await Ft(n.id);F.targetPath&&(b.textContent=F.targetPath),R.textContent=F.diff}catch(F){R.textContent=F instanceof Error?F.message:"Diff unavailable"}}async function N(){const b=e.querySelector("#ed-publish");b.setAttribute("aria-busy","true"),b.disabled=!0;try{await q();const{result:R}=await fe(n.id);r.onPublished(R.path)}finally{b.removeAttribute("aria-busy"),b.disabled=!1}}(Pe=e.querySelector("#ed-publish"))==null||Pe.addEventListener("click",()=>{N().catch(b=>{r.onError(b instanceof Error?b.message:"Publish failed")})}),(Ce=e.querySelector("#ed-publish-review"))==null||Ce.addEventListener("click",()=>{$.classList.add("hidden"),C().catch(b=>{r.onError(b instanceof Error?b.message:"Failed to prepare publish")})}),(Te=e.querySelector("#ed-publish-menu-btn"))==null||Te.addEventListener("click",()=>{var R;const b=$.classList.toggle("hidden");(R=e.querySelector("#ed-publish-menu-btn"))==null||R.setAttribute("aria-expanded",b?"false":"true")});const Y=b=>{var O,F;const R=b.target;!$.contains(R)&&!((O=e.querySelector("#ed-publish-menu-btn"))!=null&&O.contains(R))&&($.classList.add("hidden"),(F=e.querySelector("#ed-publish-menu-btn"))==null||F.setAttribute("aria-expanded","false"))};document.addEventListener("click",Y),(qe=e.querySelector("#ed-view-md"))==null||qe.addEventListener("click",()=>{T()}),(De=m.querySelector("#view-md-close"))==null||De.addEventListener("click",()=>{E()}),m.addEventListener("click",b=>{b.target===m&&E()}),(xe=m.querySelector("#view-md-copy"))==null||xe.addEventListener("click",()=>{navigator.clipboard.writeText(c()).catch(b=>{r.onError(b instanceof Error?b.message:"Copy failed")})}),(Me=e.querySelector("#publish-cancel"))==null||Me.addEventListener("click",()=>{k()}),S.addEventListener("click",b=>{b.target===S&&k()}),(Re=e.querySelector("#publish-confirm"))==null||Re.addEventListener("click",()=>{(async()=>{await q();const{result:b}=await fe(n.id);k(),r.onPublished(b.path)})().catch(b=>{r.onError(b instanceof Error?b.message:"Publish failed")})});const Le=()=>{d==null||d.destroy(),r.onClosed()};return(Ae=e.querySelector("#ed-close"))==null||Ae.addEventListener("click",Le),(He=e.querySelector("#ed-discard"))==null||He.addEventListener("click",()=>{confirm("Discard this draft?")&&(d==null||d.destroy(),Nt(n.id).then(()=>r.onDeleted()).catch(b=>{r.onError(b instanceof Error?b.message:"Delete failed")}))}),y=b=>{b.key==="Escape"&&S.classList.contains("hidden")&&m.classList.contains("hidden")&&Le()},document.addEventListener("keydown",y),{destroy:()=>{d==null||d.destroy(),document.removeEventListener("click",Y),y&&document.removeEventListener("keydown",y),k(),E(),S.remove(),m.remove()}}}function ct(e,t){const n=(t==null?void 0:t.showDiscard)??!0;return`
|
|
134
|
+
<div class="editor-action-bar">
|
|
135
|
+
<span class="editing-badge" aria-hidden="true">Editing</span>
|
|
136
|
+
<span id="ed-save-status" class="save-status" aria-live="polite"></span>
|
|
137
|
+
<div class="editor-action-spacer" aria-hidden="true"></div>
|
|
138
|
+
<div class="editor-action-primary">
|
|
139
|
+
<div class="publish-split">
|
|
140
|
+
<button type="button" id="ed-publish" class="btn-primary publish-main">Publish</button>
|
|
141
|
+
<button type="button" id="ed-publish-menu-btn" class="btn-primary publish-menu-trigger" aria-haspopup="true" aria-expanded="false" title="More publish options">▾</button>
|
|
142
|
+
<div id="ed-publish-menu" class="publish-menu hidden" role="menu">
|
|
143
|
+
<button type="button" id="ed-publish-review" role="menuitem">Review changes</button>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
<div class="editor-action-secondary">
|
|
148
|
+
<button type="button" id="ed-view-md" class="btn-ghost btn-sm">Markdown</button>
|
|
149
|
+
<button type="button" id="toggle-focus" class="btn-ghost btn-sm" aria-pressed="${e}">
|
|
150
|
+
${e?"Show info":"Hide info"}
|
|
151
|
+
</button>
|
|
152
|
+
<button type="button" id="ed-close" class="btn-ghost btn-sm">Close</button>
|
|
153
|
+
${n?'<button type="button" id="ed-discard" class="btn-ghost btn-sm btn-danger-text">Discard</button>':""}
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
`}function se(e){e.scrollTop=0,e.scrollLeft=0,window.scrollTo(0,0),document.documentElement.scrollTop=0,document.body.scrollTop=0}function ye(e){se(e),requestAnimationFrame(()=>{se(e)})}function Ue(e,t,n,r=[]){const o=oe(),l=me(e,{rootClass:"workspace-main workspace-editor",breadcrumbs:[{label:"Knowledge"},{label:"Drafts"},{label:t.title||t.slug,current:!0}],titleHtml:'<input id="ed-title" class="title-input doc-title" type="text" placeholder="Document title" />',actionsHtml:ct(o),mainHtml:'<div id="ed-visual-canvas"></div>',railHtml:it({forkedFrom:t.forked_from}),focusMode:o});return ve(e,o),ye(e),dt(e,l,t,n,r)}const fn=2;function gn(e,t,n){const r=e.toLowerCase().replace(/[^\p{L}\p{N}\s-]/gu,"").trim().replace(/\s+/g,"-").slice(0,48)||`section-${t+1}`;let o=r,l=2;for(;n.has(o);)o=`${r}-${l}`,l+=1;return o}function hn(e){const t=e.querySelectorAll("h1, h2, h3"),n=new Set,r=[];return t.forEach((o,l)=>{var p;const d=((p=o.textContent)==null?void 0:p.trim())??"";if(!d)return;const g=Number(o.tagName.charAt(1));let v=o.id;v||(v=gn(d,l,n),o.id=v),n.add(v),r.push({id:v,level:g,text:d,element:o})}),r}function ut(e,t){const n=e.getBoundingClientRect(),r=t.getBoundingClientRect();return n.top-r.top+t.scrollTop}function Be(e,t,n="smooth"){const r=ut(t,e)-16;e.scrollTo({top:Math.max(0,r),behavior:n})}function mn(e){var i;const t=e.minHeadings??fn,n=hn(e.contentRoot);if(n.length<t)return e.mountEl.classList.add("hidden"),e.mountEl.replaceChildren(),null;e.mountEl.classList.remove("hidden"),e.mountEl.replaceChildren();const r=document.createElement("div");r.className="doc-outline-track",r.setAttribute("role","presentation");const o=document.createElement("div");o.className="doc-outline-menu",o.setAttribute("role","navigation"),o.setAttribute("aria-label","On this page");const l=document.createElement("ul");l.className="doc-outline-menu-list";const d=[],g=[];for(const c of n){const s=document.createElement("button");s.type="button",s.className=`doc-outline-mark doc-outline-mark--${c.level}`,s.dataset.headingId=c.id,s.title=c.text,s.setAttribute("aria-label",c.text),r.appendChild(s),d.push(s);const a=document.createElement("li");a.className=`doc-outline-menu-item doc-outline-menu-item--${c.level}`;const u=document.createElement("button");u.type="button",u.className="doc-outline-menu-btn",u.textContent=c.text,u.addEventListener("click",()=>{Be(e.scrollRoot,c.element)}),a.appendChild(u),l.appendChild(a),g.push(u),s.addEventListener("click",()=>{Be(e.scrollRoot,c.element)})}o.appendChild(l),e.mountEl.className="doc-outline",e.mountEl.append(r,o);let v=((i=n[0])==null?void 0:i.id)??"";function p(c){var s;if(v!==c){v=c;for(const a of d)a.classList.toggle("is-active",a.dataset.headingId===c);for(const[a,u]of g.entries())u.classList.toggle("is-active",((s=n[a])==null?void 0:s.id)===c)}}function f(){const c=Math.max(e.scrollRoot.scrollHeight,1),s=r.clientHeight||1;n.forEach((a,u)=>{const w=d[u];if(!w)return;const q=ut(a.element,e.scrollRoot),M=Math.min(1,Math.max(0,q/c));w.style.top=`${M*(s-4)}px`})}function S(){const c=e.scrollRoot.getBoundingClientRect(),s=c.top+c.height*.22;let a=n[0];for(const u of n)if(u.element.getBoundingClientRect().top<=s)a=u;else break;a&&p(a.id)}const m=()=>{S()},$=()=>{f(),S()},L=new IntersectionObserver(()=>{S()},{root:e.scrollRoot,rootMargin:"-15% 0px -75% 0px",threshold:[0,.25,.5,1]});for(const c of n)L.observe(c.element);return e.scrollRoot.addEventListener("scroll",m,{passive:!0}),window.addEventListener("resize",$,{passive:!0}),f(),S(),{refresh:()=>{f(),S()},destroy:()=>{L.disconnect(),e.scrollRoot.removeEventListener("scroll",m),window.removeEventListener("resize",$),e.mountEl.classList.add("hidden"),e.mountEl.replaceChildren()}}}function vn(e){if(!e)return null;if(e.startsWith("?slug=")||e.startsWith("/?slug=")){const t=e.includes("?")?e.slice(e.indexOf("?")):e,n=new URLSearchParams(t).get("slug");return(n==null?void 0:n.trim())||null}try{const n=new URL(e,"http://local").searchParams.get("slug");return(n==null?void 0:n.trim())||null}catch{return null}}function be(e){var t,n;return((n=(t=e.split("#")[0])==null?void 0:t.split("?")[0])==null?void 0:n.trim())??""}function pt(e){const t=e.replace(/\\/g,"/").replace(/^\/+/,"");return t?t.toLowerCase().endsWith(".md")?t:`${t}.md`:""}function yn(e,t){const n=be(t);if(!n||n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")||n.startsWith("#"))return null;const r=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",o=n.replace(/\\/g,"/").split("/"),l=r?r.split("/"):[];for(const d of o)if(!(!d||d===".")){if(d===".."){if(l.length===0)return null;l.pop();continue}l.push(d)}return pt(l.join("/"))}function bn(e){let t=be(e).replace(/\\/g,"/");return!t||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("mailto:")||t.startsWith("#")||(t.startsWith("/")&&(t=t.slice(1)),t.startsWith("docs/")&&(t=t.slice(5)),!t)?null:pt(t)}function wn(e,t){const n=t.get(e);if(n)return n;const r=e.toLowerCase();for(const[o,l]of t.entries())if(o.toLowerCase()===r)return l;return null}function En(e,t,n){const r=vn(t);if(r){for(const l of n.values())if(l===r)return r;return null}const o=[yn(e,t),bn(t)].filter(l=>!!l);for(const l of o){const d=wn(l,n);if(d)return d}return null}const Sn=[".png",".jpg",".jpeg",".gif",".webp",".svg"];function Oe(e){const t=e.toLowerCase();return Sn.some(n=>t.endsWith(n))}function Ln(e,t){const n=be(t);if(!n||n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")||n.startsWith("#")||n.startsWith("data:"))return null;let r=n.replace(/\\/g,"/");if(r.startsWith("/")&&(r=r.slice(1)),r.startsWith("docs/")?r=r.slice(5):r="",r&&!r.split("/").includes("..")&&Oe(r))return r;const o=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",l=n.replace(/\\/g,"/").split("/"),d=o?o.split("/"):[];for(const v of l)if(!(!v||v===".")){if(v===".."){if(d.length===0)return null;d.pop();continue}d.push(v)}const g=d.join("/");return g&&Oe(g)?g:null}function kn(e,t){const n=Ln(e,t);return n?`/api/assets/${n.split("/").map(encodeURIComponent).join("/")}`:null}let je=null;async function $n(e){const t=e.querySelectorAll("pre.mermaid");if(t.length===0)return;const n=document.documentElement.dataset.theme==="dark"?"dark":"default",r=await lt(()=>import("./mermaid.core-DdiilVI8.js").then(o=>o.ba),__vite__mapDeps([4,5,1]));je!==n&&(r.default.initialize({startOnLoad:!1,theme:n,securityLevel:"loose"}),je=n);try{await r.default.run({nodes:[...t]})}catch{for(const o of t)if(!o.closest(".mermaid-error")){const l=o.parentElement;l==null||l.classList.add("mermaid-error")}}}let Ke=!1,B=null;function K(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Pn(e){return e.replace(at,(t,n,r)=>{const{display:o,slug:l}=ot(n,r),d=encodeURIComponent(l);return`[${o}](#wikilink:${d})`})}function Cn(){Ke||(nt.use({gfm:!0,renderer:{code({text:e,lang:t}){return t==="mermaid"?`<div class="mermaid-wrapper"><pre class="mermaid">${K(e.trim())}</pre></div>
|
|
157
|
+
`:!1},list(e){if(!e.items.some(l=>l.task))return!1;const n=e.ordered?"ol":"ul",r=e.ordered&&e.start!==1&&e.start!=null?` start="${e.start}"`:"";let o="";for(const l of e.items)o+=this.listitem(l);return`<${n} class="contains-task-list"${r}>
|
|
158
|
+
${o}</${n}>
|
|
159
|
+
`},listitem(e){if(!e.task)return!1;const t=`<input type="checkbox" class="task-list-item-checkbox"${e.checked?" checked":""} disabled>`,n=this.parser.parse(e.tokens,!!e.loose).trim();return`<li class="task-list-item"><label class="task-list-item-label">${t}<span class="task-list-item-content">${n}</span></label></li>
|
|
160
|
+
`},image({href:e,text:t,title:n}){if(!e||e.startsWith("http://")||e.startsWith("https://")||e.startsWith("data:"))return!1;if(B){const r=kn(B.docRelativePath,e);if(r){const o=K(t||n||"");return`<img src="${K(r)}" alt="${o}" loading="lazy" class="markdown-image">`}}return!1},link({href:e,text:t}){if(e!=null&&e.startsWith("#wikilink:")){const n=decodeURIComponent(e.slice(10));return`<a href="#" class="wikilink" data-slug="${K(n)}">${t}</a>`}if(B&&e){const n=En(B.docRelativePath,e,B.slugByRelative);if(n)return`<a href="#" class="wikilink" data-slug="${K(n)}">${t}</a>`}return e!=null&&e.startsWith("http://")||e!=null&&e.startsWith("https://")?`<a href="${K(e)}" target="_blank" rel="noopener noreferrer">${t}</a>`:e!=null&&e.startsWith("mailto:")||e!=null&&e.startsWith("#")?!1:e?`<a href="#" class="md-link-unresolved" title="Link not in docs index">${t}</a>`:!1}}}),Ke=!0)}function Tn(e,t){Cn(),B=t??null;try{return nt.parse(Pn(e),{async:!1})}finally{B=null}}const we="slug",ft="path",qn="draft";function Ee(){const e=new URLSearchParams(window.location.search).get(we);return e!=null&&e.trim()?e.trim():null}function Dn(){const e=new URLSearchParams(window.location.search).get(ft);return e!=null&&e.trim()?e.trim().replace(/\\/g,"/"):null}function xn(){const e=new URLSearchParams(window.location.search).get(qn);return e!=null&&e.trim()?e.trim():null}function Mn(){const e=new URL(window.location.href),t=e.pathname;if(t==="/"||t==="/index.html")return;const n=Ee();e.pathname="/",history.replaceState(n?{slug:n}:{},"",e)}function gt(){const e=new URL(window.location.href);return e.pathname="/",e}function Rn(e){const t=gt();return t.search="",t.searchParams.set(we,e),t.toString()}function An(e,t="push"){const n=gt();n.searchParams.delete(ft),n.searchParams.set(we,e);const r={slug:e};t==="replace"?history.replaceState(r,"",n):history.pushState(r,"",n)}function Hn(e){const t=()=>{e(Ee())};return window.addEventListener("popstate",t),()=>window.removeEventListener("popstate",t)}function Nn(e,t){if(t==="json")try{const n=JSON.parse(e);return JSON.stringify(n,null,2)}catch{return e}return e}function In(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Fn(e,t){const n=Nn(e,t);return`<pre class="structured-preview ${t==="json"?"structured-preview--json":"structured-preview--yaml"}"><code>${In(n)}</code></pre>`}let J=null,H=null;function ie(){J==null||J.destroy(),J=null,H==null||H.destroy(),H=null}function Wn(e,t){const n=typeof t.status=="string"?t.status:"",r=typeof t.type=="string"?t.type:"",o=typeof t.domain=="string"?t.domain:"",l=Array.isArray(t.tags)?t.tags.filter(v=>typeof v=="string"):[],d=Array.isArray(t.related)?t.related.filter(v=>typeof v=="string"):[],g=e.contentKind??"markdown";return`
|
|
161
|
+
<h2 class="page-info-title">Page info</h2>
|
|
162
|
+
<dl class="info-list">
|
|
163
|
+
<dt>Status</dt><dd><span class="status-chip status-${x(n)}">${x(n)}</span></dd>
|
|
164
|
+
<dt>Type</dt><dd>${x(r)}</dd>
|
|
165
|
+
${o?`<dt>Domain</dt><dd>${x(o)}</dd>`:""}
|
|
166
|
+
<dt>Format</dt><dd>${x(g)}</dd>
|
|
167
|
+
${l.length>0?`<dt>Tags</dt><dd>${l.map(v=>`<span class="tag-chip">${x(v)}</span>`).join(" ")}</dd>`:""}
|
|
168
|
+
</dl>
|
|
169
|
+
${d.length>0?`<div class="info-block"><div class="info-block-label">Related</div>${d.map(v=>`<button type="button" class="related-chip" data-slug="${x(v)}">${x(v)}</button>`).join("")}</div>`:""}
|
|
170
|
+
<div class="info-tabs tabs">
|
|
171
|
+
<button class="tab active" data-tab="frontmatter">Frontmatter</button>
|
|
172
|
+
<button class="tab" data-tab="agent">Agent JSON</button>
|
|
173
|
+
</div>
|
|
174
|
+
<div id="tab-frontmatter" class="tab-panel active"></div>
|
|
175
|
+
<div id="tab-agent" class="tab-panel"></div>
|
|
176
|
+
<footer class="page-info-footer">
|
|
177
|
+
<code id="doc-path">${x(e.path??"")}</code>
|
|
178
|
+
</footer>
|
|
179
|
+
`}function _n(e){e.querySelectorAll(".info-tabs .tab").forEach(t=>{t.addEventListener("click",()=>{var r;const n=t.dataset.tab;e.querySelectorAll(".info-tabs .tab").forEach(o=>o.classList.remove("active")),e.querySelectorAll(".page-info .tab-panel").forEach(o=>o.classList.remove("active")),t.classList.add("active"),(r=e.querySelector(`#tab-${n}`))==null||r.classList.add("active")})})}function ze(e){e.querySelectorAll(".related-chip").forEach(t=>{t.addEventListener("click",()=>{const n=t.dataset.slug;n&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:n}}))})})}function ht(e,t,n){return[{label:"Knowledge",crumbId:"root"},{label:he(n),crumbId:"catalog"},{label:t,current:!0}]}function mt(e,t,n,r){ie();const o=t.frontmatter??{},l=typeof o.title=="string"?o.title:t.slug??"",d=typeof o.type=="string"?o.type:"",g=oe(),v=me(e,{rootClass:"workspace-main workspace-editor workspace-page",breadcrumbs:ht(t,l,d),titleHtml:'<input id="ed-title" class="title-input doc-title" type="text" placeholder="Document title" />',actionsHtml:ct(g,{showDiscard:!0}),mainHtml:'<div id="ed-visual-canvas"></div>',railHtml:it({forkedFrom:n.forked_from}),focusMode:g});ve(e,g),J=dt(e,v,n,{onPublished:p=>{(async()=>{var f;if(await r.onPublished(p),(f=r.onDraftsChanged)==null||f.call(r),t.slug){const S=await r.onReloadDoc(t.slug);z(e,S,r)}})()},onClosed:()=>{(async()=>{var p;if((p=r.onDraftsChanged)==null||p.call(r),t.slug)try{const f=await r.onReloadDoc(t.slug);z(e,f,r)}catch(f){r.onError(f instanceof Error?f.message:"Failed to reload page")}})()},onDeleted:()=>{var p;(p=r.onDraftsChanged)==null||p.call(r),t.slug&&r.onReloadDoc(t.slug).then(f=>z(e,f,r),()=>z(e,t,r))},onError:r.onError},r.docIndex)}function z(e,t,n){var L,i,c;ie();const r=t.frontmatter??{},o=typeof r.title=="string"?r.title:t.slug??"",l=typeof r.type=="string"?r.type:"",d=oe(),g=t.contentKind??"markdown",v=g==="json"||g==="yaml",p=me(e,{rootClass:"workspace-main workspace-page",breadcrumbs:ht(t,o,l),titleHtml:`<h1 class="doc-title reader-title">${x(o)}</h1>`,actionsHtml:`
|
|
180
|
+
<button type="button" id="toggle-focus" class="btn-ghost" aria-pressed="${d}">
|
|
181
|
+
${d?"Show info":"Hide info"}
|
|
182
|
+
</button>
|
|
183
|
+
${v?"":'<button type="button" id="edit-page" class="btn-primary">Edit</button>'}
|
|
184
|
+
<button type="button" id="copy-link" class="btn-ghost">Copy link</button>
|
|
185
|
+
<button type="button" id="copy-path" class="btn-ghost">Copy path</button>
|
|
186
|
+
`,mainHtml:`
|
|
187
|
+
<div class="reader-body">
|
|
188
|
+
<div class="reader-layout">
|
|
189
|
+
<div id="tab-preview" class="markdown-preview reader-preview"></div>
|
|
190
|
+
<nav id="doc-outline" class="doc-outline hidden" aria-label="On this page"></nav>
|
|
191
|
+
</div>
|
|
192
|
+
<section id="reader-backlinks" class="reader-backlinks hidden" aria-label="Backlinks"></section>
|
|
193
|
+
</div>
|
|
194
|
+
`,railHtml:Wn(t,r),focusMode:d});ve(e,d),en(e,{root:()=>{var s;return(s=n.onNavigateRoot)==null?void 0:s.call(n)},catalog:()=>{var s;return(s=n.onNavigateCatalog)==null?void 0:s.call(n)}});const f=p.bodySlot.querySelector("#tab-preview");if(v)f.innerHTML=Fn(t.body??"",g);else{const s=n.docRelativePath&&n.slugByRelative?{docRelativePath:n.docRelativePath,slugByRelative:n.slugByRelative}:void 0;f.innerHTML=Tn(t.body??"",s),f.querySelectorAll("a.wikilink").forEach(a=>{a.addEventListener("click",u=>{u.preventDefault();const w=a.dataset.slug;w&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:w}}))})}),f.querySelectorAll("a.md-link-unresolved").forEach(a=>{a.addEventListener("click",u=>{u.preventDefault()})}),H==null||H.destroy(),H=mn({scrollRoot:e,contentRoot:f,mountEl:p.bodySlot.querySelector("#doc-outline")}),$n(f).then(()=>{H==null||H.refresh(),ye(e)})}const S=p.railSlot.querySelector("#tab-frontmatter");S.innerHTML='<pre class="frontmatter-yaml"></pre>',S.querySelector("pre").textContent=JSON.stringify(r,null,2);const m=p.railSlot.querySelector("#tab-agent");m.innerHTML='<pre class="agent-json"></pre>',m.querySelector("pre").textContent=JSON.stringify(t.agentShape,null,2),_n(e),ze(e),(L=e.querySelector("#copy-path"))==null||L.addEventListener("click",()=>{t.path&&navigator.clipboard.writeText(t.path)}),(i=e.querySelector("#copy-link"))==null||i.addEventListener("click",()=>{var s;t.slug&&(navigator.clipboard.writeText(Rn(t.slug)),(s=n.onCopyLink)==null||s.call(n))});const $=()=>{if(!t.slug||v)return;const s=p.bodySlot;s.innerHTML='<p class="reader-loading">Opening editor…</p>',tt(t.slug).then(({draft:a})=>{var u;(u=n.onDraftsChanged)==null||u.call(n),mt(e,t,a,n)}).catch(a=>{n.onError(a instanceof Error?a.message:"Edit failed"),z(e,t,n)})};(c=e.querySelector("#edit-page"))==null||c.addEventListener("click",$),t.slug&&!v&&Wt(t.slug).then(({backlinks:s})=>{const a=p.bodySlot.querySelector("#reader-backlinks");!a||s.length===0||(a.classList.remove("hidden"),a.innerHTML=`
|
|
195
|
+
<h2 class="reader-backlinks-title">Backlinks</h2>
|
|
196
|
+
<div class="reader-backlinks-list">
|
|
197
|
+
${s.map(u=>`<button type="button" class="related-chip" data-slug="${x(u.slug)}">${x(u.title)} <span class="backlink-kind">${x(u.kind)}</span></button>`).join("")}
|
|
198
|
+
</div>
|
|
199
|
+
`,ze(e),H==null||H.refresh())}).catch(()=>{})}function W(e,t,n){if(ie(),se(e),!t||!t.found){e.className="workspace-main",e.innerHTML=`
|
|
200
|
+
<div class="workspace-empty">
|
|
201
|
+
<h1>Knowledge</h1>
|
|
202
|
+
<p class="placeholder">Select a page from the tree or use the ⋯ menu to create one.</p>
|
|
203
|
+
</div>
|
|
204
|
+
`;return}z(e,t,n),ye(e)}function Ge(e,t,n,r){se(e),mt(e,t,n,r)}function Ve(e){const t=[];function n(r){for(const o of r.children)o.kind==="page"?t.push(o.slug):n(o)}return n(e),t}function Un(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"?!0:e.isContentEditable}function Bn(e){const t=n=>{if(n.metaKey||n.ctrlKey||n.altKey)return;const r=Un(n.target);if(n.key==="/"&&!r){n.preventDefault(),e.onFocusSearch();return}if(!r)switch(n.key){case"j":n.preventDefault(),e.onNext();break;case"k":n.preventDefault(),e.onPrev();break;case"e":e.onEdit();break}};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)}const vt="http://www.w3.org/2000/svg",ae={folder:"M1.75 5.25A1 1 0 0 1 2.75 4.25h3.85L8 5.65h5.25A1 1 0 0 1 14.25 6.65v5.7a1 1 0 0 1-1 1H2.75a1 1 0 0 1-1-1V5.25z",page:"M4.75 2.25A1 1 0 0 0 3.75 3.25v9.5a1 1 0 0 0 1 1h6.5a1 1 0 0 0 1-1V5.35a1 1 0 0 0-.29-.71L9.11 2.54A1 1 0 0 0 8.46 2.25H4.75zm4.35 1.79L11.75 5.5H9.1V4.04z",json:"M5.1 4.5c-.55 0-1 .45-1 1v1.2c0 .45-.2.85-.5 1.15.3.3.5.7.5 1.15v1.2c0 .55.45 1 1 1M10.9 4.5c.55 0 1 .45 1 1v1.2c0 .45.2.85.5 1.15-.3.3-.5.7-.5 1.15v1.2c0 .55-.45 1-1 1",yaml:"M3.75 5h8.5M3.75 8h8.5M3.75 11h5.5"};function On(e){if(e.startsWith("folder:"))return"tree-icon--type-folder-catalog";const t=e.replace(/[^a-z0-9-]/gi,"");return t?`tree-icon--type-${t}`:"tree-icon--type-default"}function te(e,t){return`<span class="tree-icon ${e}" aria-hidden="true">${t}</span>`}function ge(e,t){const n=(t==null?void 0:t.fill)!==!1?"currentColor":"none",r=t!=null&&t.stroke?"currentColor":"none",o=t!=null&&t.stroke?"1.15":"0",l=t!=null&&t.stroke?"round":"butt";return`<svg viewBox="0 0 16 16" xmlns="${vt}" fill="none" aria-hidden="true"><path d="${e}" fill="${n}" stroke="${r}" stroke-width="${o}" stroke-linecap="${l}" stroke-linejoin="round"/></svg>`}function jn(){return`<svg viewBox="0 0 16 16" xmlns="${vt}" fill="none" aria-hidden="true"><path d="${ae.yaml}" stroke="currentColor" stroke-width="1.15" stroke-linecap="round"/></svg>`}function Kn(){return te("tree-icon--folder",ge(ae.folder))}function yt(e,t="markdown"){return t==="json"?te("tree-icon--page tree-icon--structured",ge(ae.json,{fill:!1,stroke:!0})):t==="yaml"?te("tree-icon--page tree-icon--structured",jn()):te(`tree-icon--page ${On(e)}`,ge(ae.page))}function zn(e){return e.indexPageSlug&&e.indexPageType&&e.indexPageContentKind?yt(e.indexPageType,e.indexPageContentKind):Kn()}function Se(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Gn(e){return Se(e)}function bt(e,t){var d;const n=document.createElement("div");n.className="modal",n.innerHTML=`
|
|
205
|
+
<div class="modal-card tree-page-modal" role="dialog" aria-modal="true">
|
|
206
|
+
<h2 class="modal-title">${Se(e)}</h2>
|
|
207
|
+
${t}
|
|
208
|
+
<div class="modal-actions">
|
|
209
|
+
<button type="button" class="btn-ghost" data-action="cancel">Отмена</button>
|
|
210
|
+
<button type="button" class="btn-primary" data-action="create">Создать</button>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
`;const r=()=>{n.remove()};n.querySelector(".modal-card").addEventListener("click",g=>{g.stopPropagation()}),(d=n.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",r),n.addEventListener("click",g=>{g.target===n&&r()});const l=n.querySelector("#tree-page-name");return l.focus(),document.body.appendChild(n),{backdrop:n,nameInput:l,close:r}}function wt(e,t,n,r,o){var d;const l=()=>{const g=t.value.trim();if(!g){t.focus();return}o&&!o()||(n(),r(g))};(d=e.querySelector('[data-action="create"]'))==null||d.addEventListener("click",l),t.addEventListener("keydown",g=>{g.key==="Enter"&&(g.preventDefault(),l()),g.key==="Escape"&&n()})}function Vn(e){const t=`
|
|
214
|
+
<label class="modal-field">
|
|
215
|
+
<span class="modal-label">Имя (без .md)</span>
|
|
216
|
+
<input type="text" class="modal-input" id="tree-page-name" autocomplete="off" />
|
|
217
|
+
</label>
|
|
218
|
+
`,{backdrop:n,nameInput:r,close:o}=bt("Новый файл",t);wt(n,r,o,e)}function Jn(e,t){var v;const n=`
|
|
219
|
+
<label class="modal-field">
|
|
220
|
+
<span class="modal-label">Имя (без .md)</span>
|
|
221
|
+
<input type="text" class="modal-input" id="tree-page-name" autocomplete="off" />
|
|
222
|
+
</label>
|
|
223
|
+
<div class="modal-field">
|
|
224
|
+
<span class="modal-label" id="tree-template-label">Шаблон</span>
|
|
225
|
+
<div class="tree-template-list" role="listbox" aria-labelledby="tree-template-label">
|
|
226
|
+
${e.map((p,f)=>`
|
|
227
|
+
<button
|
|
228
|
+
type="button"
|
|
229
|
+
class="tree-template-item${f===0?" is-selected":""}"
|
|
230
|
+
role="option"
|
|
231
|
+
aria-selected="${f===0?"true":"false"}"
|
|
232
|
+
data-template-id="${Gn(p.id)}"
|
|
233
|
+
>${Se(p.label)}</button>`).join("")}
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
`,{backdrop:r,nameInput:o,close:l}=bt("Новый файл из шаблона",n),d=r.querySelector(".tree-template-list");let g=((v=e[0])==null?void 0:v.id)??"";d.addEventListener("click",p=>{const f=p.target.closest(".tree-template-item");f!=null&&f.dataset.templateId&&(g=f.dataset.templateId,d.querySelectorAll(".tree-template-item").forEach(S=>{const m=S===f;S.classList.toggle("is-selected",m),S.setAttribute("aria-selected",String(m))}))}),wt(r,o,l,p=>{g&&t(p,g)},()=>!!g)}function Xn(e){const t=e.relativePath.replace(/\\/g,"/");if(t==="README.md")return"";const n=t.lastIndexOf("/"),r=n===-1?t:t.slice(n+1),o=n===-1?"":t.slice(0,n);if(r.toLowerCase()==="readme.md")return o;const l=r.replace(/\.(md|ya?ml|json)$/i,"");return o?`${o}/${l}`:l}function Yn(e){const t=e.relativePath.replace(/\\/g,"/");return t==="README.md"?!1:(t.includes("/")?t.slice(t.lastIndexOf("/")+1):t).toLowerCase()!=="readme.md"}async function Qn(e,t){var n,r,o;if(!Yn(e))return Xn(e);try{const{result:l}=await _t(e.relativePath);return(n=t.onTreeChanged)==null||n.call(t),(r=t.onExpandFolder)==null||r.call(t,l.folderPath),l.folderPath}catch(l){return(o=t.onError)==null||o.call(t,l instanceof Error?l.message:"Promote page failed"),null}}const Et="application/x-repomind-tree-node";function _(e){return e.replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function St(e){const t=_(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function Lt(e,t){const n=_(e),r=_(t);return n?r===n||r.startsWith(`${n}/`):!0}function Je(e){var n;const t=(n=e.dataTransfer)==null?void 0:n.getData(Et);if(!t)return null;try{const r=JSON.parse(t);return r.kind!=="page"&&r.kind!=="folder"||typeof r.path!="string"?null:{kind:r.kind,path:_(r.path)}}catch{return null}}function Xe(e,t){const n=_(e.path),r=_(t);return!(St(n)===r||Lt(n.replace(/\.md$/i,""),r))}function Ye(e,t){const n=_(e.path),r=_(t);return!(n===r||St(n)===r||Lt(n,r))}function Zn(e,t){let n=null,r=null;function o(i){return i.target.closest("[data-drop-dir]")}function l(){n&&(n.classList.remove("tree-drop-target","tree-drop-invalid"),n=null)}function d(i,c){n&&n!==i&&n.classList.remove("tree-drop-target","tree-drop-invalid"),n=i,i.classList.toggle("tree-drop-target",c),i.classList.toggle("tree-drop-invalid",!c)}function g(i){const c=i.dataset.dropDir;return c===void 0?null:c}async function v(i,c){var s,a,u,w,q,M;try{if(i.kind==="page"){const{result:D}=await Ut(i.path,c);(s=t.onTreeChanged)==null||s.call(t),D.cascadeUpdated.length>0?(a=t.onNotify)==null||a.call(t,`Moved page; updated links in ${D.cascadeUpdated.length} file(s).`):D.inboundWarnings.length>0&&((u=t.onError)==null||u.call(t,`${D.inboundWarnings.length} page(s) still reference old slug "${D.previousSlug}".`));return}const{result:P}=await Bt(i.path,c);(w=t.onTreeChanged)==null||w.call(t),P.cascadeUpdated.length>0&&((q=t.onNotify)==null||q.call(t,`Moved folder; updated links in ${P.cascadeUpdated.length} file(s).`))}catch(P){(M=t.onError)==null||M.call(t,P instanceof Error?P.message:"Move failed")}}const p=i=>{const c=i.target.closest(".tree-row[data-drag-kind]");if(!c||!i.dataTransfer)return;if(i.target.closest(".tree-menu, .tree-toggle")){i.preventDefault();return}const s=c.dataset.dragKind,a=c.dataset.dragPath;if(!s||!a){i.preventDefault();return}const u={kind:s,path:a};r=u,i.dataTransfer.setData(Et,JSON.stringify(u)),i.dataTransfer.setData("text/plain",a),i.dataTransfer.effectAllowed="move",c.classList.add("is-dragging")},f=i=>{r=null;const c=i.target.closest(".tree-row");c==null||c.classList.remove("is-dragging"),l()},S=i=>{!r||!o(i)||i.preventDefault()},m=i=>{const c=r??Je(i),s=o(i);if(!c||!s)return;const a=g(s);if(a===null)return;const u=c.kind==="page"?Xe(c,a):Ye(c,a);i.preventDefault(),i.dataTransfer.dropEffect=u?"move":"none";const w=s.classList.contains("tree-row")?s:s.closest(".tree-row");w&&d(w,u)},$=i=>{const c=o(i);if(!c||c.contains(i.relatedTarget))return;const s=c.classList.contains("tree-row")?c:c.closest(".tree-row");s&&n===s&&l()},L=i=>{i.preventDefault(),i.stopPropagation();const c=r??Je(i),s=o(i),a=s?g(s):null;l(),r=null,!(!c||a===null||!(c.kind==="page"?Xe(c,a):Ye(c,a)))&&v(c,a)};return e.addEventListener("dragstart",p),e.addEventListener("dragend",f),e.addEventListener("dragenter",S),e.addEventListener("dragover",m),e.addEventListener("dragleave",$),e.addEventListener("drop",L),()=>{r=null,e.removeEventListener("dragstart",p),e.removeEventListener("dragend",f),e.removeEventListener("dragenter",S),e.removeEventListener("dragover",m),e.removeEventListener("dragleave",$),e.removeEventListener("drop",L),l()}}function Qe(e,t,n){e.draggable=!0,e.dataset.dragKind=t,e.dataset.dragPath=n}function er(e,t){e.dataset.dropDir=t}function tr(e,t){e.dataset.dropDir=t}const kt="repomind-tree-expanded";function nr(){try{const e=localStorage.getItem(kt);return e?new Set(JSON.parse(e)):new Set([""])}catch{return new Set([""])}}function Z(e){localStorage.setItem(kt,JSON.stringify([...e]))}function rr(){document.querySelectorAll(".tree-context-menu").forEach(e=>e.remove())}function Ze(e,t,n,r){Kt(e,t,void 0,n).then(({draft:o})=>{var l,d;(l=r.onTreeChanged)==null||l.call(r),(d=r.onSelectDraft)==null||d.call(r,o)}).catch(o=>{var l;(l=r.onError)==null||l.call(r,o instanceof Error?o.message:"Create page failed")})}function sr(e,t,n){var L,i,c,s;rr();const{kind:r,folderPath:o,page:l,templates:d,resolveCreateParent:g}=t,v=r==="page"||r==="folder"&&!!o,p=d.length>0,f=document.createElement("div");f.className="tree-create-menu tree-context-menu",f.innerHTML=`
|
|
237
|
+
<button type="button" data-action="folder">Добавить директорию</button>
|
|
238
|
+
<button type="button" data-action="page">Создать файл</button>
|
|
239
|
+
${p?'<button type="button" data-action="template">Создать из шаблона</button>':""}
|
|
240
|
+
${v?'<button type="button" data-action="delete" class="tree-menu-danger">Удалить</button>':""}
|
|
241
|
+
`;const S=e.getBoundingClientRect();f.style.top=`${S.bottom+4}px`,f.style.left=`${Math.max(8,S.right-200)}px`,document.body.appendChild(f);const m=()=>f.remove(),$=a=>{f.contains(a.target)||(m(),document.removeEventListener("click",$))};setTimeout(()=>document.addEventListener("click",$),0),(L=f.querySelector('[data-action="page"]'))==null||L.addEventListener("click",()=>{m(),(async()=>{const a=await g();a!==null&&Vn(u=>{Ze(a,u,void 0,n)})})()}),(i=f.querySelector('[data-action="template"]'))==null||i.addEventListener("click",()=>{m(),(async()=>{const a=await g();a!==null&&Jn(d,(u,w)=>{Ze(a,u,w,n)})})()}),(c=f.querySelector('[data-action="folder"]'))==null||c.addEventListener("click",()=>{m();const a=window.prompt("Имя директории:");a!=null&&a.trim()&&(async()=>{const u=await g();u!==null&&jt(u,a.trim()).then(()=>{var w;return(w=n.onTreeChanged)==null?void 0:w.call(n)}).catch(w=>{var q;(q=n.onError)==null||q.call(n,w instanceof Error?w.message:"Create folder failed")})})()}),(s=f.querySelector('[data-action="delete"]'))==null||s.addEventListener("click",()=>{if(m(),r==="page"&&l){if(!window.confirm(`Удалить «${l.title}»?`))return;Ie(l.relativePath,"page").then(({result:a})=>{var u,w,q,M;(u=n.onFsDeleted)==null||u.call(n,[a.slug]),(w=n.onTreeChanged)==null||w.call(n),a.cascadeUpdated.length>0?(q=n.onNotify)==null||q.call(n,`Deleted ${a.slug}; cleaned links in ${a.cascadeUpdated.length} file(s).`):a.inboundWarnings.length>0&&((M=n.onError)==null||M.call(n,`${a.inboundWarnings.length} page(s) still reference deleted slug "${a.slug}".`))}).catch(a=>{var u;(u=n.onError)==null||u.call(n,a instanceof Error?a.message:"Delete failed")});return}if(r==="folder"&&o){if(!window.confirm(`Удалить «${o}» и всё содержимое?`))return;Ie(o,"folder").then(({result:a})=>{var u,w,q,M;(u=n.onFsDeleted)==null||u.call(n,a.deletedSlugs),(w=n.onTreeChanged)==null||w.call(n),a.cascadeUpdated.length>0?(q=n.onNotify)==null||q.call(n,`Deleted folder; cleaned links in ${a.cascadeUpdated.length} file(s).`):a.inboundWarnings.length>0&&((M=n.onError)==null||M.call(n,`${a.inboundWarnings.length} page(s) still reference deleted page(s).`))}).catch(a=>{var u;(u=n.onError)==null||u.call(n,a instanceof Error?a.message:"Delete folder failed")})}})}function ar(e,t,n,r){var c;e.innerHTML=`
|
|
242
|
+
<nav id="docs-tree" class="docs-tree" aria-label="Documentation tree"></nav>
|
|
243
|
+
<section class="catalog-section catalog-drafts">
|
|
244
|
+
<button type="button" class="catalog-header" data-catalog="__drafts__" aria-expanded="true">
|
|
245
|
+
<span class="catalog-chevron" aria-hidden="true">▾</span>
|
|
246
|
+
<span class="catalog-icon catalog-icon--draft" aria-hidden="true">✎</span>
|
|
247
|
+
<span class="catalog-label">Drafts</span>
|
|
248
|
+
<span class="catalog-count">${n.length}</span>
|
|
249
|
+
</button>
|
|
250
|
+
<ul id="draft-list" class="catalog-pages"></ul>
|
|
251
|
+
</section>
|
|
252
|
+
`;const o=e.querySelector("#docs-tree"),l=e.querySelector("#draft-list"),d=nr();let g=null,v=null,p=null;function f(s){d.add("");let a="";for(const u of s.split("/").filter(Boolean))a=a?`${a}/${u}`:u,d.add(a);Z(d)}async function S(s,a){var u;try{g||(g=(await Ot()).templates),sr(s,{...a,templates:g},r)}catch(w){(u=r.onError)==null||u.call(r,w instanceof Error?w.message:"Failed to open menu")}}function m(s,a){var M,P;const u=document.createElement("div");u.className="tree-page";const w=document.createElement("div");w.className="tree-row",w.style.paddingLeft=`${a*12+8}px`,s.slug===v&&w.classList.add("active"),w.innerHTML=`
|
|
253
|
+
<span class="tree-spacer" aria-hidden="true"></span>
|
|
254
|
+
<button type="button" class="tree-label">
|
|
255
|
+
${yt(s.type,s.contentKind)}
|
|
256
|
+
<span class="tree-title">${de(s.title)}</span>
|
|
257
|
+
</button>
|
|
258
|
+
<button type="button" class="tree-menu" title="Actions">⋯</button>
|
|
259
|
+
`;const q=s.relativePath.includes("/")?s.relativePath.slice(0,s.relativePath.lastIndexOf("/")):"";return(M=w.querySelector(".tree-menu"))==null||M.addEventListener("click",D=>{D.stopPropagation(),S(D.currentTarget,{kind:"page",parentPath:q,folderPath:q,page:s,resolveCreateParent:()=>Qn(s,{onTreeChanged:r.onTreeChanged,onError:r.onError,onExpandFolder:f})})}),(P=w.querySelector(".tree-label"))==null||P.addEventListener("click",()=>{v=s.slug,p=null,L(),i(),r.onSelectSlug(s.slug)}),Qe(w,"page",s.relativePath),u.appendChild(w),u}function $(s,a){var D,y,k;const u=document.createElement("div");u.className="tree-folder";const w=d.has(s.relativePath),q=!!s.indexPageSlug,M=s.indexPageTitle??s.name,P=document.createElement("div");if(P.className="tree-row",P.style.paddingLeft=`${a*12+8}px`,q&&s.indexPageSlug===v&&P.classList.add("active"),P.innerHTML=`
|
|
260
|
+
<button type="button" class="tree-toggle" aria-expanded="${w}">${w?"▾":"▸"}</button>
|
|
261
|
+
<button type="button" class="tree-label">
|
|
262
|
+
${zn(s)}
|
|
263
|
+
<span class="tree-title">${de(M)}</span>
|
|
264
|
+
</button>
|
|
265
|
+
<button type="button" class="tree-menu" title="Actions">⋯</button>
|
|
266
|
+
`,(D=P.querySelector(".tree-toggle"))==null||D.addEventListener("click",h=>{h.stopPropagation(),d.has(s.relativePath)?d.delete(s.relativePath):d.add(s.relativePath),Z(d),L()}),(y=P.querySelector(".tree-label"))==null||y.addEventListener("click",()=>{if(q&&s.indexPageSlug){v=s.indexPageSlug,p=null,L(),i(),r.onSelectSlug(s.indexPageSlug);return}d.has(s.relativePath)?d.delete(s.relativePath):d.add(s.relativePath),Z(d),L()}),(k=P.querySelector(".tree-menu"))==null||k.addEventListener("click",h=>{h.stopPropagation(),S(h.currentTarget,{kind:"folder",parentPath:s.relativePath,folderPath:s.relativePath,resolveCreateParent:async()=>s.relativePath})}),Qe(P,"folder",s.relativePath),er(P,s.relativePath),u.appendChild(P),w){const h=document.createElement("div");h.className="tree-children",tr(h,s.relativePath);for(const E of s.children??[])E.kind==="folder"?h.appendChild($(E,a+1)):h.appendChild(m(E,a+1));u.appendChild(h)}return u}function L(){o.innerHTML="",o.appendChild($(t,0))}function i(){if(l.innerHTML="",n.length===0){l.innerHTML='<li class="placeholder page-item">No drafts</li>';return}for(const s of n){const a=document.createElement("li");a.className="page-item",s.id===p&&a.classList.add("active"),a.innerHTML=`<span class="page-title">${de(s.title||s.slug)}</span><span class="status-chip status-draft">draft</span>`,a.addEventListener("click",()=>{var u;p=s.id,v=null,L(),i(),(u=r.onSelectDraft)==null||u.call(r,s)}),l.appendChild(a)}}L(),i(),Zn(o,{onTreeChanged:r.onTreeChanged,onError:r.onError,onNotify:r.onNotify}),(c=e.querySelector('[data-catalog="__drafts__"]'))==null||c.addEventListener("click",()=>{const s=e.querySelector("#draft-list"),a=e.querySelector('[data-catalog="__drafts__"]'),u=(s==null?void 0:s.classList.toggle("hidden"))===!1;a==null||a.setAttribute("aria-expanded",String(u));const w=a==null?void 0:a.querySelector(".catalog-chevron");w&&(w.textContent=u?"▾":"▸")}),e.setActiveSlug=s=>{v=s,p=null,d.add(""),Z(d),L(),i()},e.setActiveDraft=s=>{p=s,v=null,L(),i()},e.refreshDrafts=s=>{n.length=0,n.push(...s),i();const a=e.querySelector(".catalog-drafts .catalog-count");a&&(a.textContent=String(n.length))},e.refreshTree=(s,a)=>{t.children=s.children??[],t.emoji=s.emoji,t.indexPageSlug=s.indexPageSlug,t.indexPageTitle=s.indexPageTitle,t.indexPageRelativePath=s.indexPageRelativePath,t.indexPageType=s.indexPageType,t.indexPageContentKind=s.indexPageContentKind,t.name=s.name,n.length=0,n.push(...a??[]),L(),i()}}function de(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}const ne="repomind-sidebar-width",$t=220,Pt=420,G=280;function re(e){return Math.min(Pt,Math.max($t,e))}function or(){try{const e=localStorage.getItem(ne);if(!e)return G;const t=Number.parseInt(e,10);return Number.isFinite(t)?re(t):G}catch{return G}}function ee(e,t){e.style.setProperty("--sidebar-width",`${t}px`)}function ir(e){const t=or();ee(e,t);const n=document.createElement("div");n.className="sidebar-resize-handle",n.setAttribute("role","separator"),n.setAttribute("aria-orientation","vertical"),n.setAttribute("aria-label","Resize sidebar"),n.tabIndex=0;const r=e.querySelector("#sidebar");r!=null&&r.nextSibling?e.insertBefore(n,r.nextSibling):e.appendChild(n);let o=!1,l=0,d=t;const g=m=>{if(!o)return;const $=m.clientX-l;ee(e,re(d+$))},v=()=>{if(!o)return;o=!1,n.classList.remove("is-dragging"),document.body.style.cursor="",document.body.style.userSelect="";const m=ce(e);localStorage.setItem(ne,String(m)),window.removeEventListener("pointermove",g),window.removeEventListener("pointerup",v)},p=m=>{m.button===0&&(o=!0,l=m.clientX,d=ce(e),n.classList.add("is-dragging"),document.body.style.cursor="col-resize",document.body.style.userSelect="none",n.setPointerCapture(m.pointerId),window.addEventListener("pointermove",g),window.addEventListener("pointerup",v))},f=m=>{const $=m.shiftKey?40:16;let L=ce(e);if(m.key==="ArrowLeft")L=re(L-$);else if(m.key==="ArrowRight")L=re(L+$);else if(m.key==="Home")L=$t;else if(m.key==="End")L=Pt;else return;m.preventDefault(),ee(e,L),localStorage.setItem(ne,String(L))},S=()=>{ee(e,G),localStorage.setItem(ne,String(G))};return n.addEventListener("pointerdown",p),n.addEventListener("keydown",f),n.addEventListener("dblclick",S),()=>{n.removeEventListener("pointerdown",p),n.removeEventListener("keydown",f),n.removeEventListener("dblclick",S),n.remove()}}function ce(e){const t=getComputedStyle(e).getPropertyValue("--sidebar-width").trim(),n=Number.parseInt(t,10);return Number.isFinite(n)?n:G}function lr(e){const t=new EventSource("/api/events");return t.onmessage=()=>{e()},()=>{t.close()}}Mn();zt();function ue(e){return new Map(e.map(t=>[t.relativePath,t.slug]))}function pe(e,t){var n;return(n=e.find(r=>r.slug===t))==null?void 0:n.relativePath}function A(e,t=!1){const n=document.querySelector("#banner");n&&(n.textContent=e,n.classList.toggle("error",t),n.classList.remove("hidden"),setTimeout(()=>n.classList.add("hidden"),5e3))}async function et(e){var n;const{drafts:t}=await X();return(n=e.refreshDrafts)==null||n.call(e,t),t}async function dr(){var D;const e=document.querySelector("#app");if(!e||!await Gt(e))return;Vt(document.querySelector("#theme-toggle"));const n=document.querySelector(".layout");n&&ir(n);const r=document.querySelector("#sidebar"),o=document.querySelector("#workspace"),l=document.querySelector("#health-toggle"),d=document.querySelector("#stats"),g=document.querySelector("#global-search"),v=document.querySelector("#search-dropdown");let p=[],f=null,S=[],m="workspace",$=null,L=null;async function i(y){var E;const[{tree:k},{drafts:h}]=await Promise.all([Fe(),X()]);return(E=y.refreshTree)==null||E.call(y,k,h),S=Ve(k),k}function c(y){if(m=y,l.setAttribute("aria-pressed",String(y==="dashboard")),y==="dashboard"){$=Qt(o,{onOpenDraft:h=>{c("workspace"),w(h)},onPublished:h=>{(async()=>(await i(r),await s(),A(`Published: ${h}`)))()},onNotify:(h,E)=>A(h,E)}).refresh;return}$=null,ie(),W(o,null,a())}l.addEventListener("click",()=>{c(m==="dashboard"?"workspace":"dashboard")}),Bn({onNext:()=>{if(m!=="workspace"||!f)return;const y=S.indexOf(f);y>=0&&y<S.length-1&&P(S[y+1])},onPrev:()=>{if(m!=="workspace"||!f)return;const y=S.indexOf(f);y>0&&P(S[y-1])},onFocusSearch:()=>{g.focus(),g.select()},onEdit:()=>{m==="workspace"&&f&&M(f)}});async function s(){const y=await Xt(),h=await(await fetch("/api/stats")).json(),{drafts:E}=await X(),T=h.brokenRelatedCount>0?` · ${h.brokenRelatedCount} broken links`:"";d.textContent=`v${y.version} · ${y.docCount} pages · ${E.length} drafts${T}`}function a(){return{docIndex:p,onPublished:async y=>{p=(await j()).docs,await i(r),await s(),$==null||$(),A(`Published: ${y}`)},onError:y=>A(y,!0),onReloadDoc:y=>Q(y),onDraftsChanged:()=>{et(r)},onCopyLink:()=>A("Link copied")}}function u(y){if(y.length===0){v.innerHTML='<p class="search-empty">No matches</p>',v.classList.remove("hidden");return}const k=document.createElement("ul");k.className="search-results";for(const h of y){const E=p.find(C=>C.slug===h.slug),T=document.createElement("li");T.innerHTML=`
|
|
267
|
+
<div class="search-result-title">${h.title}</div>
|
|
268
|
+
<div class="search-result-meta">${he((E==null?void 0:E.type)??"")} · ${h.snippet}</div>
|
|
269
|
+
`,T.addEventListener("click",()=>{v.classList.add("hidden"),g.value="",P(h.slug)}),k.appendChild(T)}v.innerHTML="",v.appendChild(k),v.classList.remove("hidden")}g.addEventListener("input",()=>{const y=g.value.trim();if(L&&clearTimeout(L),!y){v.classList.add("hidden"),v.innerHTML="";return}L=setTimeout(()=>{Jt(y).then(({results:k})=>u(k)).catch(k=>A(k instanceof Error?k.message:"Search failed",!0))},300)}),document.addEventListener("click",y=>{!v.contains(y.target)&&y.target!==g&&v.classList.add("hidden")});function w(y){var h;c("workspace"),(h=r.setActiveDraft)==null||h.call(r,y.id);const k=y.forked_from??(p.some(E=>E.slug===y.slug)?y.slug:null);if(k){Q(k).then(E=>{Ge(o,E,y,{...a(),docRelativePath:pe(p,k),slugByRelative:ue(p),onPublished:async T=>{await a().onPublished(T),await P(y.slug)}})}).catch(()=>{Ue(o,y,q(),p)});return}Ue(o,y,q(),p)}function q(){return{onPublished:y=>{(async()=>{p=(await j()).docs,await i(r),await s(),$==null||$(),A(`Published: ${y}`);const h=p.find(E=>E.slug===draft.slug);h&&await P(h.slug)})()},onClosed:()=>{W(o,null,a())},onDeleted:()=>{(async()=>(await i(r),W(o,null,a())))()},onError:y=>A(y,!0)}}async function M(y){if(m==="workspace")try{const k=await Q(y),{draft:h}=await tt(y);await et(r),Ge(o,k,h,{...a(),docRelativePath:pe(p,y),slugByRelative:ue(p)})}catch(k){A(k instanceof Error?k.message:"Edit failed",!0)}}async function P(y,k={}){var T;const h=k.updateUrl??!0,E=k.urlMode??"push";m==="dashboard"&&c("workspace"),f=y,(T=r.setActiveSlug)==null||T.call(r,y);try{const C=await Q(y),N=pe(p,y);W(o,C,{...a(),docRelativePath:N,slugByRelative:ue(p)}),h&&An(y,E)}catch(C){A(C instanceof Error?C.message:"Failed to load doc",!0)}}o.addEventListener("navigate-slug",(y=>{P(y.detail.slug)}));try{await s();const[y,{tree:k},{drafts:h}]=await Promise.all([j(),Fe(),X()]);p=y.docs,S=Ve(k),ar(r,k,h,{onSelectSlug:C=>{P(C)},onSelectDraft:C=>w(C),onTreeChanged:()=>{(async()=>(p=(await j()).docs,await i(r),await s()))()},onFsDeleted:C=>{(async()=>(p=(await j()).docs,f&&C.includes(f)&&(f=null,W(o,null,a())),await i(r),await s()))()},onError:C=>A(C,!0),onNotify:C=>A(C)}),lr(()=>{(async()=>{try{p=(await j()).docs,await i(r),await s(),f&&!p.some(N=>N.slug===f)&&(f=null,W(o,null,a()))}catch{}})()}),Hn(C=>{if(!C){f=null,W(o,null,a());return}p.some(N=>N.slug===C)&&P(C,{updateUrl:!1})}),W(o,null,a());const E=Ee(),T=xn();if(T){const C=h.find(N=>N.id===T);C?w(C):A(`Unknown draft: ${T}`,!0)}else if(E)p.some(C=>C.slug===E)?await P(E,{updateUrl:!1}):A(`Unknown page: ${E}`,!0);else{const C=Dn(),N=C?(D=p.find(Y=>Y.relativePath===C))==null?void 0:D.slug:void 0;C&&N?await P(N,{updateUrl:!1}):C?A(`Unknown path: ${C}`,!0):k.indexPageSlug?await P(k.indexPageSlug,{urlMode:"replace"}):p.length>0&&p[0]&&await P(p[0].slug,{urlMode:"replace"})}}catch(y){A(y instanceof Error?y.message:"Failed to load workspace",!0)}}dr();export{lt as _,on as a,$n as e,pr as f,ot as p};
|