@ripla/godd-mcp 1.0.2-canary.8 → 1.0.3
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/dist/godd.cjs +4 -4
- package/dist/godd.js +21 -4
- package/dist/index.js +2 -2
- package/notes-api/app/services/pr_chain.py +31 -1
- package/notes-api/tests/test_pr_chain.py +88 -0
- package/notes-app/src/lib/branch-diff.test.ts +45 -0
- package/notes-app/src/lib/branch-diff.ts +25 -0
- package/notes-app/src/lib/draft-storage.test.ts +53 -0
- package/notes-app/src/lib/draft-storage.ts +64 -0
- package/notes-app/src/lib/tree-utils.ts +39 -0
- package/notes-app/src/pages/MainPage.insertChildEntry.test.ts +30 -1
- package/notes-app/src/pages/MainPage.tsx +110 -62
- package/package.json +2 -2
- package/templates/github-actions/aws/deploy-notes.yml.hbs +5 -6
- package/templates/prompts/docs-init.hbs +8 -2
package/dist/godd.cjs
CHANGED
|
@@ -69,7 +69,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
69
69
|
`,e.length-o>t&&s>o?c+=e.slice(o,s)+`
|
|
70
70
|
`+e.slice(s+1):c+=e.slice(o),c.slice(1)}function _M(e){for(var t="",r=0,n,o=0;o<e.length;r>=65536?o+=2:o++)r=vs(e,o),n=ot[r],!n&&ks(r)?(t+=e[o],r>=65536&&(t+=e[o+1])):t+=n||uM(r);return t}function vM(e,t,r){var n="",o=e.tag,i,s,a;for(i=0,s=r.length;i<s;i+=1)a=r[i],e.replacer&&(a=e.replacer.call(r,String(i),a)),(Rr(e,t,a,!1,!1)||typeof a>"u"&&Rr(e,t,null,!1,!1))&&(n!==""&&(n+=","+(e.condenseFlow?"":" ")),n+=e.dump);e.tag=o,e.dump="["+n+"]"}function Iw(e,t,r,n){var o="",i=e.tag,s,a,c;for(s=0,a=r.length;s<a;s+=1)c=r[s],e.replacer&&(c=e.replacer.call(r,String(s),c)),(Rr(e,t+1,c,!0,!0,!1,!0)||typeof c>"u"&&Rr(e,t+1,null,!0,!0,!1,!0))&&((!n||o!=="")&&(o+=_m(e,t)),e.dump&&xs===e.dump.charCodeAt(0)?o+="-":o+="- ",o+=e.dump);e.tag=i,e.dump=o||"[]"}function bM(e,t,r){var n="",o=e.tag,i=Object.keys(r),s,a,c,u,p;for(s=0,a=i.length;s<a;s+=1)p="",n!==""&&(p+=", "),e.condenseFlow&&(p+='"'),c=i[s],u=r[c],e.replacer&&(u=e.replacer.call(r,c,u)),Rr(e,t,c,!1,!1)&&(e.dump.length>1024&&(p+="? "),p+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),Rr(e,t,u,!1,!1)&&(p+=e.dump,n+=p));e.tag=o,e.dump="{"+n+"}"}function xM(e,t,r,n){var o="",i=e.tag,s=Object.keys(r),a,c,u,p,l,d;if(e.sortKeys===!0)s.sort();else if(typeof e.sortKeys=="function")s.sort(e.sortKeys);else if(e.sortKeys)throw new dt("sortKeys must be a boolean or a function");for(a=0,c=s.length;a<c;a+=1)d="",(!n||o!=="")&&(d+=_m(e,t)),u=s[a],p=r[u],e.replacer&&(p=e.replacer.call(r,u,p)),Rr(e,t+1,u,!0,!0,!0)&&(l=e.tag!==null&&e.tag!=="?"||e.dump&&e.dump.length>1024,l&&(e.dump&&xs===e.dump.charCodeAt(0)?d+="?":d+="? "),d+=e.dump,l&&(d+=_m(e,t)),Rr(e,t+1,p,!0,l)&&(e.dump&&xs===e.dump.charCodeAt(0)?d+=":":d+=": ",d+=e.dump,o+=d));e.tag=i,e.dump=o||"{}"}function zw(e,t,r){var n,o,i,s,a,c;for(o=r?e.explicitTypes:e.implicitTypes,i=0,s=o.length;i<s;i+=1)if(a=o[i],(a.instanceOf||a.predicate)&&(!a.instanceOf||typeof t=="object"&&t instanceof a.instanceOf)&&(!a.predicate||a.predicate(t))){if(r?a.multi&&a.representName?e.tag=a.representName(t):e.tag=a.tag:e.tag="?",a.represent){if(c=e.styleMap[a.tag]||a.defaultStyle,uk.call(a.represent)==="[object Function]")n=a.represent(t,c);else if(lk.call(a.represent,c))n=a.represent[c](t,c);else throw new dt("!<"+a.tag+'> tag resolver accepts not "'+c+'" style');e.dump=n}return!0}return!1}function Rr(e,t,r,n,o,i,s){e.tag=null,e.dump=r,zw(e,r,!1)||zw(e,r,!0);var a=uk.call(e.dump),c=n,u;n&&(n=e.flowLevel<0||e.flowLevel>t);var p=a==="[object Object]"||a==="[object Array]",l,d;if(p&&(l=e.duplicates.indexOf(r),d=l!==-1),(e.tag!==null&&e.tag!=="?"||d||e.indent!==2&&t>0)&&(o=!1),d&&e.usedDuplicates[l])e.dump="*ref_"+l;else{if(p&&d&&!e.usedDuplicates[l]&&(e.usedDuplicates[l]=!0),a==="[object Object]")n&&Object.keys(e.dump).length!==0?(xM(e,t,e.dump,o),d&&(e.dump="&ref_"+l+e.dump)):(bM(e,t,e.dump),d&&(e.dump="&ref_"+l+" "+e.dump));else if(a==="[object Array]")n&&e.dump.length!==0?(e.noArrayIndent&&!s&&t>0?Iw(e,t-1,e.dump,o):Iw(e,t,e.dump,o),d&&(e.dump="&ref_"+l+e.dump)):(vM(e,t,e.dump),d&&(e.dump="&ref_"+l+" "+e.dump));else if(a==="[object String]")e.tag!=="?"&&gM(e,e.dump,t,i,c);else{if(a==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new dt("unacceptable kind of an object to dump "+a)}e.tag!==null&&e.tag!=="?"&&(u=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?u="!"+u:u.slice(0,18)==="tag:yaml.org,2002:"?u="!!"+u.slice(18):u="!<"+u+">",e.dump=u+" "+e.dump)}return!0}function wM(e,t){var r=[],n=[],o,i;for(bm(e,r,n),o=0,i=n.length;o<i;o+=1)t.duplicates.push(r[n[o]]);t.usedDuplicates=new Array(i)}function bm(e,t,r){var n,o,i;if(e!==null&&typeof e=="object")if(o=t.indexOf(e),o!==-1)r.indexOf(o)===-1&&r.push(o);else if(t.push(e),Array.isArray(e))for(o=0,i=e.length;o<i;o+=1)bm(e[o],t,r);else for(n=Object.keys(e),o=0,i=n.length;o<i;o+=1)bm(e[n[o]],t,r)}function kM(e,t){t=t||{};var r=new pM(t);r.noRefs||wM(e,r);var n=e;return r.replacer&&(n=r.replacer.call({"":n},"",n)),Rr(r,0,n,!0,!0)?r.dump+`
|
|
71
71
|
`:""}function Tm(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var Tj,Pj,Cj,Ej,Ij,zj,Ze,dt,Rj,Oj,Nj,Je,Ow,Nw,Dw,jw,Mw,Lw,Zw,qw,Yj,e3,Fw,Uw,Bw,Hw,Vw,Gw,Ww,xm,Kw,p3,d3,Jw,m3,Yw,_3,Qw,wm,fn,Bc,Xw,ek,Hc,mm,x3,_w,w3,k3,S3,tk,rk,ok,ik,Qn,xw,F3,U3,ck,uk,lk,$m,B3,xs,H3,V3,G3,W3,ym,K3,J3,Y3,Q3,pk,X3,Gc,eM,tM,rM,nM,dk,fk,oM,hk,iM,mk,ot,sM,aM,lM,ws,yk,vm,_k,vk,Bo,SM,$M,TM,PM,CM,EM,IM,zM,AM,RM,OM,NM,DM,jM,MM,LM,hn,Pm=_(()=>{Tj=Aw,Pj=xj,Cj=wj,Ej=Sj,Ij=$j,zj=kj,Ze={isNothing:Tj,isObject:Pj,toArray:Cj,repeat:Ej,isNegativeZero:Ij,extend:zj};bs.prototype=Object.create(Error.prototype);bs.prototype.constructor=bs;bs.prototype.toString=function(t){return this.name+": "+Rw(this,t)};dt=bs;Rj=Aj,Oj=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],Nj=["scalar","sequence","mapping"];Je=jj;gm.prototype.extend=function(t){var r=[],n=[];if(t instanceof Je)n.push(t);else if(Array.isArray(t))n=n.concat(t);else if(t&&(Array.isArray(t.implicit)||Array.isArray(t.explicit)))t.implicit&&(r=r.concat(t.implicit)),t.explicit&&(n=n.concat(t.explicit));else throw new dt("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(i){if(!(i instanceof Je))throw new dt("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(i.loadKind&&i.loadKind!=="scalar")throw new dt("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(i.multi)throw new dt("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(i){if(!(i instanceof Je))throw new dt("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var o=Object.create(gm.prototype);return o.implicit=(this.implicit||[]).concat(r),o.explicit=(this.explicit||[]).concat(n),o.compiledImplicit=yw(o,"implicit"),o.compiledExplicit=yw(o,"explicit"),o.compiledTypeMap=Mj(o.compiledImplicit,o.compiledExplicit),o};Ow=gm,Nw=new Je("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return e!==null?e:""}}),Dw=new Je("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return e!==null?e:[]}}),jw=new Je("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return e!==null?e:{}}}),Mw=new Ow({explicit:[Nw,Dw,jw]});Lw=new Je("tag:yaml.org,2002:null",{kind:"scalar",resolve:Lj,construct:Zj,predicate:qj,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});Zw=new Je("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Fj,construct:Uj,predicate:Bj,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"});qw=new Je("tag:yaml.org,2002:int",{kind:"scalar",resolve:Wj,construct:Kj,predicate:Jj,represent:{binary:function(e){return e>=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),Yj=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");e3=/^[-+]?[0-9]+e/;Fw=new Je("tag:yaml.org,2002:float",{kind:"scalar",resolve:Qj,construct:Xj,predicate:r3,represent:t3,defaultStyle:"lowercase"}),Uw=Mw.extend({implicit:[Lw,Zw,qw,Fw]}),Bw=Uw,Hw=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Vw=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");Gw=new Je("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:n3,construct:o3,instanceOf:Date,represent:i3});Ww=new Je("tag:yaml.org,2002:merge",{kind:"scalar",resolve:s3}),xm=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
|
|
72
|
-
\r`;Kw=new Je("tag:yaml.org,2002:binary",{kind:"scalar",resolve:a3,construct:c3,predicate:l3,represent:u3}),p3=Object.prototype.hasOwnProperty,d3=Object.prototype.toString;Jw=new Je("tag:yaml.org,2002:omap",{kind:"sequence",resolve:f3,construct:h3}),m3=Object.prototype.toString;Yw=new Je("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:g3,construct:y3}),_3=Object.prototype.hasOwnProperty;Qw=new Je("tag:yaml.org,2002:set",{kind:"mapping",resolve:v3,construct:b3}),wm=Bw.extend({implicit:[Gw,Ww],explicit:[Kw,Jw,Yw,Qw]}),fn=Object.prototype.hasOwnProperty,Bc=1,Xw=2,ek=3,Hc=4,mm=1,x3=2,_w=3,w3=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,k3=/[\x85\u2028\u2029]/,S3=/[,\[\]\{\}]/,tk=/^(?:!|!!|![a-z\-]+!)$/i,rk=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;ok=new Array(256),ik=new Array(256);for(Qn=0;Qn<256;Qn++)ok[Qn]=bw(Qn)?1:0,ik[Qn]=bw(Qn);xw={YAML:function(t,r,n){var o,i,s;t.version!==null&&j(t,"duplication of %YAML directive"),n.length!==1&&j(t,"YAML directive accepts exactly one argument"),o=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),o===null&&j(t,"ill-formed argument of the YAML directive"),i=parseInt(o[1],10),s=parseInt(o[2],10),i!==1&&j(t,"unacceptable YAML version of the document"),t.version=n[0],t.checkLineBreaks=s<2,s!==1&&s!==2&&Vc(t,"unsupported YAML version of the document")},TAG:function(t,r,n){var o,i;n.length!==2&&j(t,"TAG directive accepts exactly two arguments"),o=n[0],i=n[1],tk.test(o)||j(t,"ill-formed tag handle (first argument) of the TAG directive"),fn.call(t.tagMap,o)&&j(t,'there is a previously declared suffix for "'+o+'" tag handle'),rk.test(i)||j(t,"ill-formed tag prefix (second argument) of the TAG directive");try{i=decodeURIComponent(i)}catch{j(t,"tag prefix is malformed: "+i)}t.tagMap[o]=i}};F3=Z3,U3=q3,ck={loadAll:F3,load:U3},uk=Object.prototype.toString,lk=Object.prototype.hasOwnProperty,$m=65279,B3=9,xs=10,H3=13,V3=32,G3=33,W3=34,ym=35,K3=37,J3=38,Y3=39,Q3=42,pk=44,X3=45,Gc=58,eM=61,tM=62,rM=63,nM=64,dk=91,fk=93,oM=96,hk=123,iM=124,mk=125,ot={};ot[0]="\\0";ot[7]="\\a";ot[8]="\\b";ot[9]="\\t";ot[10]="\\n";ot[11]="\\v";ot[12]="\\f";ot[13]="\\r";ot[27]="\\e";ot[34]='\\"';ot[92]="\\\\";ot[133]="\\N";ot[160]="\\_";ot[8232]="\\L";ot[8233]="\\P";sM=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],aM=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;lM=1,ws=2;yk=1,vm=2,_k=3,vk=4,Bo=5;SM=kM,$M={dump:SM};TM=Je,PM=Ow,CM=Mw,EM=Uw,IM=Bw,zM=wm,AM=ck.load,RM=ck.loadAll,OM=$M.dump,NM=dt,DM={binary:Kw,float:Fw,map:jw,null:Lw,pairs:Yw,set:Qw,timestamp:Gw,bool:Zw,int:qw,merge:Ww,omap:Jw,seq:Dw,str:Nw},jM=Tm("safeLoad","load"),MM=Tm("safeLoadAll","loadAll"),LM=Tm("safeDump","dump"),hn={Type:TM,Schema:PM,FAILSAFE_SCHEMA:CM,JSON_SCHEMA:EM,CORE_SCHEMA:IM,DEFAULT_SCHEMA:zM,load:AM,loadAll:RM,dump:OM,YAMLException:NM,types:DM,safeLoad:jM,safeLoadAll:MM,safeDump:LM}});var ZM,qM,FM,UM,BM,HM,bk,xk,wk=_(()=>{"use strict";pe();ZM=g.object({id:g.string(),label:g.string(),name:g.string(),mindset_template:g.string().optional()}),qM=g.object({name:g.string(),root_dir:g.string().default("frontend"),build_command:g.string(),package_manager:g.string().default("pnpm"),mindset_template:g.string().optional()}),FM=g.object({name:g.string(),root_dir:g.string().default("backend"),architecture:g.string(),dependency_direction:g.string(),package_manager:g.string().default("uv"),mindset_template:g.string().optional()}),UM=g.object({frontend:g.string().optional(),backend:g.string().optional(),preflight_command:g.string().default("pnpm preflight"),summary:g.string().default("format/lint/typecheck/build")}),BM=g.object({name:g.string(),description:g.string(),runtime:g.enum(["python","node","unknown"]).default("unknown"),setup_hint:g.string().optional(),enabled:g.boolean().default(!0)}),HM=g.object({id:g.string(),label:g.string(),category:g.enum(["frontend","backend","testing","infra","devtool","monitoring"]),description:g.string(),url:g.string().optional(),guidance:g.string().optional()}),bk=g.object({name:g.string(),description:g.string().optional(),stacks:g.array(ZM),frontend:qM.optional(),backend:FM.optional(),quality_gate:UM.optional(),vendor:g.array(BM).optional(),tools:g.array(HM).optional()}),xk=g.object({license_key:g.string().min(1,"license_key \u306F\u5FC5\u9808\u3067\u3059"),stack_profile:g.string().optional(),components:g.array(g.string().min(1,"\u7A7A\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u540D\u306F\u7121\u52B9\u3067\u3059")).optional(),language:g.string().default("en"),registry_url:g.string().default("https://godd-
|
|
72
|
+
\r`;Kw=new Je("tag:yaml.org,2002:binary",{kind:"scalar",resolve:a3,construct:c3,predicate:l3,represent:u3}),p3=Object.prototype.hasOwnProperty,d3=Object.prototype.toString;Jw=new Je("tag:yaml.org,2002:omap",{kind:"sequence",resolve:f3,construct:h3}),m3=Object.prototype.toString;Yw=new Je("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:g3,construct:y3}),_3=Object.prototype.hasOwnProperty;Qw=new Je("tag:yaml.org,2002:set",{kind:"mapping",resolve:v3,construct:b3}),wm=Bw.extend({implicit:[Gw,Ww],explicit:[Kw,Jw,Yw,Qw]}),fn=Object.prototype.hasOwnProperty,Bc=1,Xw=2,ek=3,Hc=4,mm=1,x3=2,_w=3,w3=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,k3=/[\x85\u2028\u2029]/,S3=/[,\[\]\{\}]/,tk=/^(?:!|!!|![a-z\-]+!)$/i,rk=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;ok=new Array(256),ik=new Array(256);for(Qn=0;Qn<256;Qn++)ok[Qn]=bw(Qn)?1:0,ik[Qn]=bw(Qn);xw={YAML:function(t,r,n){var o,i,s;t.version!==null&&j(t,"duplication of %YAML directive"),n.length!==1&&j(t,"YAML directive accepts exactly one argument"),o=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),o===null&&j(t,"ill-formed argument of the YAML directive"),i=parseInt(o[1],10),s=parseInt(o[2],10),i!==1&&j(t,"unacceptable YAML version of the document"),t.version=n[0],t.checkLineBreaks=s<2,s!==1&&s!==2&&Vc(t,"unsupported YAML version of the document")},TAG:function(t,r,n){var o,i;n.length!==2&&j(t,"TAG directive accepts exactly two arguments"),o=n[0],i=n[1],tk.test(o)||j(t,"ill-formed tag handle (first argument) of the TAG directive"),fn.call(t.tagMap,o)&&j(t,'there is a previously declared suffix for "'+o+'" tag handle'),rk.test(i)||j(t,"ill-formed tag prefix (second argument) of the TAG directive");try{i=decodeURIComponent(i)}catch{j(t,"tag prefix is malformed: "+i)}t.tagMap[o]=i}};F3=Z3,U3=q3,ck={loadAll:F3,load:U3},uk=Object.prototype.toString,lk=Object.prototype.hasOwnProperty,$m=65279,B3=9,xs=10,H3=13,V3=32,G3=33,W3=34,ym=35,K3=37,J3=38,Y3=39,Q3=42,pk=44,X3=45,Gc=58,eM=61,tM=62,rM=63,nM=64,dk=91,fk=93,oM=96,hk=123,iM=124,mk=125,ot={};ot[0]="\\0";ot[7]="\\a";ot[8]="\\b";ot[9]="\\t";ot[10]="\\n";ot[11]="\\v";ot[12]="\\f";ot[13]="\\r";ot[27]="\\e";ot[34]='\\"';ot[92]="\\\\";ot[133]="\\N";ot[160]="\\_";ot[8232]="\\L";ot[8233]="\\P";sM=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],aM=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;lM=1,ws=2;yk=1,vm=2,_k=3,vk=4,Bo=5;SM=kM,$M={dump:SM};TM=Je,PM=Ow,CM=Mw,EM=Uw,IM=Bw,zM=wm,AM=ck.load,RM=ck.loadAll,OM=$M.dump,NM=dt,DM={binary:Kw,float:Fw,map:jw,null:Lw,pairs:Yw,set:Qw,timestamp:Gw,bool:Zw,int:qw,merge:Ww,omap:Jw,seq:Dw,str:Nw},jM=Tm("safeLoad","load"),MM=Tm("safeLoadAll","loadAll"),LM=Tm("safeDump","dump"),hn={Type:TM,Schema:PM,FAILSAFE_SCHEMA:CM,JSON_SCHEMA:EM,CORE_SCHEMA:IM,DEFAULT_SCHEMA:zM,load:AM,loadAll:RM,dump:OM,YAMLException:NM,types:DM,safeLoad:jM,safeLoadAll:MM,safeDump:LM}});var ZM,qM,FM,UM,BM,HM,bk,xk,wk=_(()=>{"use strict";pe();ZM=g.object({id:g.string(),label:g.string(),name:g.string(),mindset_template:g.string().optional()}),qM=g.object({name:g.string(),root_dir:g.string().default("frontend"),build_command:g.string(),package_manager:g.string().default("pnpm"),mindset_template:g.string().optional()}),FM=g.object({name:g.string(),root_dir:g.string().default("backend"),architecture:g.string(),dependency_direction:g.string(),package_manager:g.string().default("uv"),mindset_template:g.string().optional()}),UM=g.object({frontend:g.string().optional(),backend:g.string().optional(),preflight_command:g.string().default("pnpm preflight"),summary:g.string().default("format/lint/typecheck/build")}),BM=g.object({name:g.string(),description:g.string(),runtime:g.enum(["python","node","unknown"]).default("unknown"),setup_hint:g.string().optional(),enabled:g.boolean().default(!0)}),HM=g.object({id:g.string(),label:g.string(),category:g.enum(["frontend","backend","testing","infra","devtool","monitoring"]),description:g.string(),url:g.string().optional(),guidance:g.string().optional()}),bk=g.object({name:g.string(),description:g.string().optional(),stacks:g.array(ZM),frontend:qM.optional(),backend:FM.optional(),quality_gate:UM.optional(),vendor:g.array(BM).optional(),tools:g.array(HM).optional()}),xk=g.object({license_key:g.string().min(1,"license_key \u306F\u5FC5\u9808\u3067\u3059"),stack_profile:g.string().optional(),components:g.array(g.string().min(1,"\u7A7A\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u540D\u306F\u7121\u52B9\u3067\u3059")).optional(),language:g.string().default("en"),registry_url:g.string().default("https://dev.api.godd.ripla-inc.com")}).refine(e=>e.stack_profile!==void 0||e.components!==void 0&&e.components.length>0,{message:"Either 'stack_profile' or 'components' must be provided"})});function kk(e){let t=e??process.env.GODD_CONFIG;if(!t)throw new Error(`${Ut} \u306E\u30D1\u30B9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002GODD_CONFIG \u74B0\u5883\u5909\u6570\u3092\u8A2D\u5B9A\u3059\u308B\u304B\u3001\u660E\u793A\u7684\u306B\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);if(!(0,Wo.existsSync)(t))throw new Error(`${Ut} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${t}
|
|
73
73
|
GODD_CONFIG \u74B0\u5883\u5909\u6570\u307E\u305F\u306F .cursor/mcp.json \u306E env.GODD_CONFIG \u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let r=(0,Wo.readFileSync)(t,"utf-8"),n=hn.load(r);return xk.parse(n)}function GM(e){let t=hn.load(e);return bk.parse(t)}function Cm(e,t){if(!VM.test(e))throw new Error(`\u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u540D\u304C\u4E0D\u6B63\u3067\u3059: '${e}' \u2014 \u82F1\u6570\u5B57\u30FB\u30CF\u30A4\u30D5\u30F3\u30FB\u30C9\u30C3\u30C8\u30FB\u30A2\u30F3\u30C0\u30FC\u30B9\u30B3\u30A2\u306E\u307F\u4F7F\u7528\u53EF\u80FD\u3067\u3059\u3002`);let r=t??(0,Ss.join)(process.cwd(),"stacks"),n=(0,Ss.resolve)(r,`${e}.yaml`);if(!n.startsWith((0,Ss.resolve)(r)))throw new Error(`\u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9\u304C\u4E0D\u6B63\u3067\u3059: '${e}'`);if(!(0,Wo.existsSync)(n))throw new Error(`\u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${e}' \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${n}`);let o=(0,Wo.readFileSync)(n,"utf-8");return GM(o)}var Wo,Ss,VM,Ut,Em=_(()=>{"use strict";Wo=require("node:fs"),Ss=require("node:path");Pm();wk();VM=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/,Ut="config.godd"});function Ne(e){return e instanceof Error?e.message:String(e)}var Ko=_(()=>{"use strict"});var ft=S(It=>{"use strict";It.__esModule=!0;It.extend=Sk;It.indexOf=QM;It.escapeExpression=XM;It.isEmpty=eL;It.createFrame=tL;It.blockParams=rL;It.appendContextPath=nL;var WM={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},KM=/[&<>"'`=]/g,JM=/[&<>"'`=]/;function YM(e){return WM[e]}function Sk(e){for(var t=1;t<arguments.length;t++)for(var r in arguments[t])Object.prototype.hasOwnProperty.call(arguments[t],r)&&(e[r]=arguments[t][r]);return e}var zm=Object.prototype.toString;It.toString=zm;var Im=function(t){return typeof t=="function"};Im(/x/)&&(It.isFunction=Im=function(e){return typeof e=="function"&&zm.call(e)==="[object Function]"});It.isFunction=Im;var $k=Array.isArray||function(e){return e&&typeof e=="object"?zm.call(e)==="[object Array]":!1};It.isArray=$k;function QM(e,t){for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return-1}function XM(e){if(typeof e!="string"){if(e&&e.toHTML)return e.toHTML();if(e==null)return"";if(!e)return e+"";e=""+e}return JM.test(e)?e.replace(KM,YM):e}function eL(e){return!e&&e!==0?!0:!!($k(e)&&e.length===0)}function tL(e){var t=Sk({},e);return t._parent=e,t}function rL(e,t){return e.path=t,e}function nL(e,t){return(e?e+".":"")+t}});var Bt=S((Jc,Tk)=>{"use strict";Jc.__esModule=!0;var Am=["description","fileName","lineNumber","endLineNumber","message","name","number","stack"];function Rm(e,t){var r=t&&t.loc,n=void 0,o=void 0,i=void 0,s=void 0;r&&(n=r.start.line,o=r.end.line,i=r.start.column,s=r.end.column,e+=" - "+n+":"+i);for(var a=Error.prototype.constructor.call(this,e),c=0;c<Am.length;c++)this[Am[c]]=a[Am[c]];Error.captureStackTrace&&Error.captureStackTrace(this,Rm);try{r&&(this.lineNumber=n,this.endLineNumber=o,Object.defineProperty?(Object.defineProperty(this,"column",{value:i,enumerable:!0}),Object.defineProperty(this,"endColumn",{value:s,enumerable:!0})):(this.column=i,this.endColumn=s))}catch{}}Rm.prototype=new Error;Jc.default=Rm;Tk.exports=Jc.default});var Ck=S((Yc,Pk)=>{"use strict";Yc.__esModule=!0;var Om=ft();Yc.default=function(e){e.registerHelper("blockHelperMissing",function(t,r){var n=r.inverse,o=r.fn;if(t===!0)return o(this);if(t===!1||t==null)return n(this);if(Om.isArray(t))return t.length>0?(r.ids&&(r.ids=[r.name]),e.helpers.each(t,r)):n(this);if(r.data&&r.ids){var i=Om.createFrame(r.data);i.contextPath=Om.appendContextPath(r.data.contextPath,r.name),r={data:i}}return o(t,r)})};Pk.exports=Yc.default});var Ik=S((Qc,Ek)=>{"use strict";Qc.__esModule=!0;function oL(e){return e&&e.__esModule?e:{default:e}}var $s=ft(),iL=Bt(),sL=oL(iL);Qc.default=function(e){e.registerHelper("each",function(t,r){if(!r)throw new sL.default("Must pass iterator to #each");var n=r.fn,o=r.inverse,i=0,s="",a=void 0,c=void 0;r.data&&r.ids&&(c=$s.appendContextPath(r.data.contextPath,r.ids[0])+"."),$s.isFunction(t)&&(t=t.call(this)),r.data&&(a=$s.createFrame(r.data));function u(h,m,y){a&&(a.key=h,a.index=m,a.first=m===0,a.last=!!y,c&&(a.contextPath=c+h)),s=s+n(t[h],{data:a,blockParams:$s.blockParams([t[h],h],[c+h,null])})}if(t&&typeof t=="object")if($s.isArray(t))for(var p=t.length;i<p;i++)i in t&&u(i,i,i===t.length-1);else if(typeof Symbol=="function"&&t[Symbol.iterator]){for(var l=[],d=t[Symbol.iterator](),f=d.next();!f.done;f=d.next())l.push(f.value);t=l;for(var p=t.length;i<p;i++)u(i,i,i===t.length-1)}else(function(){var h=void 0;Object.keys(t).forEach(function(m){h!==void 0&&u(h,i-1),h=m,i++}),h!==void 0&&u(h,i-1,!0)})();return i===0&&(s=o(this)),s})};Ek.exports=Qc.default});var Ak=S((Xc,zk)=>{"use strict";Xc.__esModule=!0;function aL(e){return e&&e.__esModule?e:{default:e}}var cL=Bt(),uL=aL(cL);Xc.default=function(e){e.registerHelper("helperMissing",function(){if(arguments.length!==1)throw new uL.default('Missing helper: "'+arguments[arguments.length-1].name+'"')})};zk.exports=Xc.default});var Dk=S((eu,Nk)=>{"use strict";eu.__esModule=!0;function lL(e){return e&&e.__esModule?e:{default:e}}var Rk=ft(),pL=Bt(),Ok=lL(pL);eu.default=function(e){e.registerHelper("if",function(t,r){if(arguments.length!=2)throw new Ok.default("#if requires exactly one argument");return Rk.isFunction(t)&&(t=t.call(this)),!r.hash.includeZero&&!t||Rk.isEmpty(t)?r.inverse(this):r.fn(this)}),e.registerHelper("unless",function(t,r){if(arguments.length!=2)throw new Ok.default("#unless requires exactly one argument");return e.helpers.if.call(this,t,{fn:r.inverse,inverse:r.fn,hash:r.hash})})};Nk.exports=eu.default});var Mk=S((tu,jk)=>{"use strict";tu.__esModule=!0;tu.default=function(e){e.registerHelper("log",function(){for(var t=[void 0],r=arguments[arguments.length-1],n=0;n<arguments.length-1;n++)t.push(arguments[n]);var o=1;r.hash.level!=null?o=r.hash.level:r.data&&r.data.level!=null&&(o=r.data.level),t[0]=o,e.log.apply(e,t)})};jk.exports=tu.default});var Zk=S((ru,Lk)=>{"use strict";ru.__esModule=!0;ru.default=function(e){e.registerHelper("lookup",function(t,r,n){return t&&n.lookupProperty(t,r)})};Lk.exports=ru.default});var Fk=S((nu,qk)=>{"use strict";nu.__esModule=!0;function dL(e){return e&&e.__esModule?e:{default:e}}var Ts=ft(),fL=Bt(),hL=dL(fL);nu.default=function(e){e.registerHelper("with",function(t,r){if(arguments.length!=2)throw new hL.default("#with requires exactly one argument");Ts.isFunction(t)&&(t=t.call(this));var n=r.fn;if(Ts.isEmpty(t))return r.inverse(this);var o=r.data;return r.data&&r.ids&&(o=Ts.createFrame(r.data),o.contextPath=Ts.appendContextPath(r.data.contextPath,r.ids[0])),n(t,{data:o,blockParams:Ts.blockParams([t],[o&&o.contextPath])})})};qk.exports=nu.default});var Nm=S(ou=>{"use strict";ou.__esModule=!0;ou.registerDefaultHelpers=EL;ou.moveHelperToHooks=IL;function eo(e){return e&&e.__esModule?e:{default:e}}var mL=Ck(),gL=eo(mL),yL=Ik(),_L=eo(yL),vL=Ak(),bL=eo(vL),xL=Dk(),wL=eo(xL),kL=Mk(),SL=eo(kL),$L=Zk(),TL=eo($L),PL=Fk(),CL=eo(PL);function EL(e){gL.default(e),_L.default(e),bL.default(e),wL.default(e),SL.default(e),TL.default(e),CL.default(e)}function IL(e,t,r){e.helpers[t]&&(e.hooks[t]=e.helpers[t],r||delete e.helpers[t])}});var Bk=S((iu,Uk)=>{"use strict";iu.__esModule=!0;var zL=ft();iu.default=function(e){e.registerDecorator("inline",function(t,r,n,o){var i=t;return r.partials||(r.partials={},i=function(s,a){var c=n.partials;n.partials=zL.extend({},c,r.partials);var u=t(s,a);return n.partials=c,u}),r.partials[o.args[0]]=o.fn,i})};Uk.exports=iu.default});var Hk=S(Dm=>{"use strict";Dm.__esModule=!0;Dm.registerDefaultDecorators=NL;function AL(e){return e&&e.__esModule?e:{default:e}}var RL=Bk(),OL=AL(RL);function NL(e){OL.default(e)}});var jm=S((su,Vk)=>{"use strict";su.__esModule=!0;var DL=ft(),Jo={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(t){if(typeof t=="string"){var r=DL.indexOf(Jo.methodMap,t.toLowerCase());r>=0?t=r:t=parseInt(t,10)}return t},log:function(t){if(t=Jo.lookupLevel(t),typeof console<"u"&&Jo.lookupLevel(Jo.level)<=t){var r=Jo.methodMap[t];console[r]||(r="log");for(var n=arguments.length,o=Array(n>1?n-1:0),i=1;i<n;i++)o[i-1]=arguments[i];console[r].apply(console,o)}}};su.default=Jo;Vk.exports=su.default});var Gk=S(Mm=>{"use strict";Mm.__esModule=!0;Mm.createNewLookupObject=ML;var jL=ft();function ML(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return jL.extend.apply(void 0,[Object.create(null)].concat(t))}});var Lm=S(Ps=>{"use strict";Ps.__esModule=!0;Ps.createProtoAccessControl=FL;Ps.resultIsAllowed=UL;Ps.resetLoggedProperties=HL;function LL(e){return e&&e.__esModule?e:{default:e}}var Wk=Gk(),ZL=jm(),qL=LL(ZL),au=Object.create(null);function FL(e){var t=Object.create(null);t.constructor=!1,t.__defineGetter__=!1,t.__defineSetter__=!1,t.__lookupGetter__=!1;var r=Object.create(null);return r.__proto__=!1,{properties:{whitelist:Wk.createNewLookupObject(r,e.allowedProtoProperties),defaultValue:e.allowProtoPropertiesByDefault},methods:{whitelist:Wk.createNewLookupObject(t,e.allowedProtoMethods),defaultValue:e.allowProtoMethodsByDefault}}}function UL(e,t,r){return Kk(typeof e=="function"?t.methods:t.properties,r)}function Kk(e,t){return e.whitelist[t]!==void 0?e.whitelist[t]===!0:e.defaultValue!==void 0?e.defaultValue:(BL(t),!1)}function BL(e){au[e]!==!0&&(au[e]=!0,qL.default.log("error",'Handlebars: Access has been denied to resolve the property "'+e+`" because it is not an "own property" of its parent.
|
|
74
74
|
You can add a runtime option to disable the check or this warning:
|
|
75
75
|
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details`))}function HL(){Object.keys(au).forEach(function(e){delete au[e]})}});var uu=S(br=>{"use strict";br.__esModule=!0;br.HandlebarsEnvironment=Fm;function Jk(e){return e&&e.__esModule?e:{default:e}}var to=ft(),VL=Bt(),Zm=Jk(VL),GL=Nm(),WL=Hk(),KL=jm(),cu=Jk(KL),JL=Lm(),YL="4.7.8";br.VERSION=YL;var QL=8;br.COMPILER_REVISION=QL;var XL=7;br.LAST_COMPATIBLE_COMPILER_REVISION=XL;var e9={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0 <4.3.0",8:">= 4.3.0"};br.REVISION_CHANGES=e9;var qm="[object Object]";function Fm(e,t,r){this.helpers=e||{},this.partials=t||{},this.decorators=r||{},GL.registerDefaultHelpers(this),WL.registerDefaultDecorators(this)}Fm.prototype={constructor:Fm,logger:cu.default,log:cu.default.log,registerHelper:function(t,r){if(to.toString.call(t)===qm){if(r)throw new Zm.default("Arg not supported with multiple helpers");to.extend(this.helpers,t)}else this.helpers[t]=r},unregisterHelper:function(t){delete this.helpers[t]},registerPartial:function(t,r){if(to.toString.call(t)===qm)to.extend(this.partials,t);else{if(typeof r>"u")throw new Zm.default('Attempting to register a partial called "'+t+'" as undefined');this.partials[t]=r}},unregisterPartial:function(t){delete this.partials[t]},registerDecorator:function(t,r){if(to.toString.call(t)===qm){if(r)throw new Zm.default("Arg not supported with multiple decorators");to.extend(this.decorators,t)}else this.decorators[t]=r},unregisterDecorator:function(t){delete this.decorators[t]},resetLoggedPropertyAccesses:function(){JL.resetLoggedProperties()}};var t9=cu.default.log;br.log=t9;br.createFrame=to.createFrame;br.logger=cu.default});var Qk=S((lu,Yk)=>{"use strict";lu.__esModule=!0;function Um(e){this.string=e}Um.prototype.toString=Um.prototype.toHTML=function(){return""+this.string};lu.default=Um;Yk.exports=lu.default});var Xk=S(Bm=>{"use strict";Bm.__esModule=!0;Bm.wrapHelper=r9;function r9(e,t){if(typeof e!="function")return e;var r=function(){var o=arguments[arguments.length-1];return arguments[arguments.length-1]=t(o),e.apply(this,arguments)};return r}});var oS=S(mn=>{"use strict";mn.__esModule=!0;mn.checkRevision=c9;mn.template=u9;mn.wrapProgram=pu;mn.resolvePartial=l9;mn.invokePartial=p9;mn.noop=rS;function n9(e){return e&&e.__esModule?e:{default:e}}function o9(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}var i9=ft(),Or=o9(i9),s9=Bt(),Nr=n9(s9),Dr=uu(),eS=Nm(),a9=Xk(),tS=Lm();function c9(e){var t=e&&e[0]||1,r=Dr.COMPILER_REVISION;if(!(t>=Dr.LAST_COMPATIBLE_COMPILER_REVISION&&t<=Dr.COMPILER_REVISION))if(t<Dr.LAST_COMPATIBLE_COMPILER_REVISION){var n=Dr.REVISION_CHANGES[r],o=Dr.REVISION_CHANGES[t];throw new Nr.default("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+n+") or downgrade your runtime to an older version ("+o+").")}else throw new Nr.default("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+e[1]+").")}function u9(e,t){if(!t)throw new Nr.default("No environment passed to template");if(!e||!e.main)throw new Nr.default("Unknown template object: "+typeof e);e.main.decorator=e.main_d,t.VM.checkRevision(e.compiler);var r=e.compiler&&e.compiler[0]===7;function n(s,a,c){c.hash&&(a=Or.extend({},a,c.hash),c.ids&&(c.ids[0]=!0)),s=t.VM.resolvePartial.call(this,s,a,c);var u=Or.extend({},c,{hooks:this.hooks,protoAccessControl:this.protoAccessControl}),p=t.VM.invokePartial.call(this,s,a,u);if(p==null&&t.compile&&(c.partials[c.name]=t.compile(s,e.compilerOptions,t),p=c.partials[c.name](a,u)),p!=null){if(c.indent){for(var l=p.split(`
|
|
@@ -256,10 +256,10 @@ ${i.map(a=>`- ${a}`).join(`
|
|
|
256
256
|
\`\`\`yaml
|
|
257
257
|
${yT(s)}\`\`\`
|
|
258
258
|
|
|
259
|
-
\u26A0 MCP \u30B5\u30FC\u30D0\u30FC\u306E\u518D\u8D77\u52D5\u304C\u5FC5\u8981\u3067\u3059\uFF08Cursor IDE \u3092\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002`}var yn,_T,vT,bT,wT=_(()=>{"use strict";pe();yn=require("node:fs");Pm();Em();_T="godd_config",vT="config.godd \u306E\u8868\u793A\u30FB\u66F4\u65B0\u3092\u884C\u3044\u307E\u3059\u3002show \u3067\u73FE\u5728\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3001update \u3067\u6307\u5B9A\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u66F4\u65B0\u3057\u307E\u3059\u3002GODD_CONFIG \u74B0\u5883\u5909\u6570\u3067\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",bT=g.object({action:g.enum(["show","update"]).describe("show=\u73FE\u5728\u306E\u8A2D\u5B9A\u3092\u8868\u793A, update=\u8A2D\u5B9A\u3092\u66F4\u65B0"),license_key:g.string().min(1,"license_key \u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093").max(1e3).optional().describe("\u66F4\u65B0\u3059\u308B\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\uFF08action=update \u6642\u306E\u307F\uFF09"),components:g.array(g.string().min(1).max(1e3)).min(1,"components \u306F\u7A7A\u914D\u5217\u306B\u3067\u304D\u307E\u305B\u3093").optional().describe("\u66F4\u65B0\u3059\u308B\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u914D\u5217\uFF08action=update \u6642\u306E\u307F\uFF09"),language:g.string().min(1,"language \u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093").max(1e3).optional().describe("\u66F4\u65B0\u3059\u308B\u8A00\u8A9E\uFF08action=update \u6642\u306E\u307F\uFF09"),registry_url:g.string().min(1,"registry_url \u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093").url("registry_url \u306F\u6709\u52B9\u306A URL \u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093").max(1e3).optional().describe("\u66F4\u65B0\u3059\u308B Registry URL\uFF08action=update \u6642\u306E\u307F\uFF09")})});function zg(e){Ig=e}function kT(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Buffer.from(t,"base64")}function Ag(e){return c5.test(e.trim())}function u5(e){let t=e.trim();if(Ag(t))throw new $t("Registry \u767A\u884C\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F Registry API \u3067\u691C\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044");let r=t.split(".");if(r.length!==2)throw new $t("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306E\u5F62\u5F0F\u304C\u4E0D\u6B63\u3067\u3059");let[n,o]=r;if(Ig){let c=(0,Du.createPublicKey)(Ig),u=kT(o);if(!(0,Du.verify)(null,Buffer.from(n),c,u))throw new $t("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306E\u7F72\u540D\u304C\u7121\u52B9\u3067\u3059")}else if(process.env.SKIP_LICENSE_VERIFY!=="true")throw new $t("\u516C\u958B\u9375\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u304C\u3067\u304D\u307E\u305B\u3093");let i=kT(n).toString("utf-8"),s;try{s=JSON.parse(i)}catch{throw new $t("\u30E9\u30A4\u30BB\u30F3\u30B9\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u89E3\u6790\u306B\u5931\u6557\u3057\u307E\u3057\u305F")}if(s.v!==1)throw new $t(`\u672A\u5BFE\u5FDC\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30D0\u30FC\u30B8\u30E7\u30F3: ${s.v}`);let a=new Date(s.exp);if(isNaN(a.getTime()))throw new $t("\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u304C\u4E0D\u6B63\u3067\u3059");if(a<new Date)throw new $t(`\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u3066\u3044\u307E\u3059\uFF08${s.exp}\uFF09`);return s}function Rg(e,t){let r=u5(e);if(r.stack&&r.stack!==t)throw new $t(`\u3053\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u306F\u30B9\u30BF\u30C3\u30AF '${r.stack}' \u5C02\u7528\u3067\u3059\uFF08\u8981\u6C42: '${t}'\uFF09`);return r}var Du,c5,Ig,$t,ST=_(()=>{"use strict";Du=require("node:crypto"),c5=/^godd-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Ig="";$t=class extends Error{constructor(t){super(t),this.name="LicenseError"}}});var TT={};Br(TT,{startServer:()=>$T});function l5(){try{let e=(0,ir.join)(qr,"..","package.json");return JSON.parse((0,ao.readFileSync)(e,"utf-8")).version??"0.0.0"}catch{return"0.0.0"}}async function p5(e){let t=e.components??[];if(t.length===0)return null;let r=await C1(t,e.language,e.license_key);if(r&&!r.isExpired){console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F");try{let n=JSON.parse(r.data);return Ls(n),n}catch{console.error("[GoDD] \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002Registry API \u304B\u3089\u518D\u30D5\u30A7\u30C3\u30C1\u3057\u307E\u3059")}}try{let n=E1(t,e.language),o=await w1(e,n);if(o===null&&r){console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306F\u30AD\u30E3\u30C3\u30B7\u30E5\u3068\u540C\u4E00\u3067\u3059\uFF08304\uFF09");try{let i=JSON.parse(r.data);return Ls(i),i}catch{console.error("[GoDD] 304 \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F")}}if(o){let i=await k1(o.bundle,e.license_key);Ls(i);let s=JSON.stringify(i);return await P1(s,o.etag,t,e.language,e.license_key),console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092 Registry API \u304B\u3089\u30D5\u30A7\u30C3\u30C1\u3057\u307E\u3057\u305F"),i}}catch(n){console.error(`[GoDD] Registry API \u3078\u306E\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${Ne(n)}`)}if(r){console.error("[GoDD] \u8B66\u544A: \u671F\u9650\u5207\u308C\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\uFF08Registry API \u5230\u9054\u4E0D\u80FD\uFF09");try{let n=JSON.parse(r.data);return Ls(n),n}catch{console.error("[GoDD] \u671F\u9650\u5207\u308C\u30AD\u30E3\u30C3\u30B7\u30E5\u306E JSON \u30D1\u30FC\u30B9\u306B\u3082\u5931\u6557\u3057\u307E\u3057\u305F")}}return null}async function $T(){let e=kk(),t=e.components&&e.components.length>0,r;if(t){try{let d=await x1(e);d.valid||(console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC: ${d.error??"\u4E0D\u660E\u306A\u30A8\u30E9\u30FC"}`),process.exit(1))}catch(d){console.error(`[GoDD] Registry \u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u5931\u6557\u3002\u30ED\u30FC\u30AB\u30EB\u691C\u8A3C\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: ${Ne(d)}`),Ag(e.license_key)&&(console.error("[GoDD] Registry \u767A\u884C\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F\u30ED\u30FC\u30AB\u30EB\u7F72\u540D\u691C\u8A3C\u3067\u304D\u307E\u305B\u3093\u3002registry_url \u3068\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u63A5\u7D9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1));let f=(0,ir.join)(qr,"..",".keys","public.pem");(0,ao.existsSync)(f)&&zg((0,ao.readFileSync)(f,"utf-8"));try{let h=e.components?.[0]??e.stack_profile??"fastapi-react";Rg(e.license_key,h)}catch(h){h instanceof $t?console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC (\u30ED\u30FC\u30AB\u30EB\u691C\u8A3C): ${h.message}`):console.error(`[GoDD] \u30ED\u30FC\u30AB\u30EB\u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u3067\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC: ${Ne(h)}`),process.exit(1)}}try{await Cg(e.registry_url,e.license_key)}catch(d){console.error("\u30EA\u30DD\u30B8\u30C8\u30EA\u691C\u8A3C\u30A8\u30E9\u30FC:",Ne(d)),console.error(" godd init \u3092\u518D\u5B9F\u884C\u3059\u308B\u304B\u3001Registry API \u304C\u8D77\u52D5\u3057\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1)}let l=await p5(e);if(l)r={name:`registry:${e.components.join("+")}`,stacks:e.components.map(d=>({id:d,label:d,name:d})),quality_gate:l.quality_gate?{frontend:l.quality_gate.frontend,backend:l.quality_gate.backend,preflight_command:l.quality_gate.preflight??"pnpm preflight",summary:"format/lint/typecheck/build"}:void 0,tools:l.tools?.map(d=>({id:d.id,label:d.label,category:d.category,description:d.description,guidance:d.guidance}))};else{console.error("[GoDD] Registry/\u30AD\u30E3\u30C3\u30B7\u30E5\u5229\u7528\u4E0D\u53EF\u3002\u30ED\u30FC\u30AB\u30EB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF"),kg((0,ir.join)(qr,"..","templates"));let d=e.stack_profile??"fastapi-react";try{r=Cm(d,(0,ir.join)(qr,"..","stacks"))}catch(f){console.error(`[GoDD] \u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${d}' \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${Ne(f)}`),console.error("[GoDD] \u6700\u5C0F\u9650\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u8D77\u52D5\u3057\u307E\u3059"),r={name:d,stacks:[]}}}}else{let l=(0,ir.join)(qr,"..",".keys","public.pem");(0,ao.existsSync)(l)&&zg((0,ao.readFileSync)(l,"utf-8"));try{Rg(e.license_key,e.stack_profile??"fastapi-react")}catch(h){h instanceof $t&&(console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC: ${h.message}`),process.exit(1)),console.error(`[GoDD] \u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u3067\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC: ${Ne(h)}`),process.exit(1)}let d=e.stack_profile??"fastapi-react";try{r=Cm(d,(0,ir.join)(qr,"..","stacks"))}catch(h){console.error(`[GoDD] \u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${d}' \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${Ne(h)}`),console.error("[GoDD] \u6700\u5C0F\u9650\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u8D77\u52D5\u3057\u307E\u3059"),r={name:d,stacks:[]}}await y1(e.license_key)||kg((0,ir.join)(qr,"..","templates"))}let n={profile:r,config:e},o=new qc({name:"godd-mcp-server",version:l5()});async function i(l){return t&&await N1(e.registry_url,e.license_key),l()}let s=[];function a(l,d,f,h){let m=f.shape;o.tool(l,d,m,async y=>({content:[{type:"text",text:await i(()=>h(n,f.parse(y)))}]})),s.push({name:l,description:d,params:Object.keys(m)})}function c(l,d,f,h){let m=f.shape;o.tool(l,d,m,async y=>({content:[{type:"text",text:await h(f.parse(y))}]})),s.push({name:l,description:d,params:Object.keys(m)})}a(L1,Z1,q1,F1),a(B1,H1,V1,G1),a(K1,J1,Y1,Q1),a(e2,t2,r2,n2),a(i2,s2,a2,c2),a(l2,p2,d2,f2),a(m2,g2,y2,_2),a(b2,x2,w2,k2),a($2,T2,P2,C2),a(I2,z2,A2,R2),a(N2,D2,j2,M2),a(Z2,q2,F2,U2),a(H2,V2,G2,W2),a(J2,Y2,Q2,X2),a(t$,r$,n$,o$),a(s$,a$,c$,u$),a(p$,d$,f$,h$),a(g$,y$,_$,v$),a(x$,w$,k$,S$),a(T$,P$,C$,E$),a(z$,A$,R$,O$),a(D$,j$,M$,L$),a(q$,F$,U$,B$),a(V$,G$,W$,K$),a(Y$,Q$,X$,eT),a(rT,nT,oT,iT),a(aT,cT,uT,lT),a(dT,fT,hT,mT),c(_T,vT,bT,xT);let u=r?.tools??[];u.length>0&&o.resource("ecosystem-tool",new _s("godd://tools/{toolId}",{list:async()=>({resources:u.map(l=>({uri:`godd://tools/${l.id}`,name:l.label,description:l.description,mimeType:"text/plain"}))})}),async(l,{toolId:d})=>{let f=u.find(m=>m.id===String(d));if(!f)return{contents:[{uri:l.href,text:"Tool not found"}]};let h=[`# ${f.label}`,"",`- **\u30AB\u30C6\u30B4\u30EA**: ${f.category}`,`- **\u8AAC\u660E**: ${f.description}`];return f.guidance&&h.push("","## \u5229\u7528\u30AC\u30A4\u30C0\u30F3\u30B9","",f.guidance),"url"in f&&f.url&&h.push("",`- **\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8**: ${f.url}`),{contents:[{uri:l.href,text:h.join(`
|
|
259
|
+
\u26A0 MCP \u30B5\u30FC\u30D0\u30FC\u306E\u518D\u8D77\u52D5\u304C\u5FC5\u8981\u3067\u3059\uFF08Cursor IDE \u3092\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002`}var yn,_T,vT,bT,wT=_(()=>{"use strict";pe();yn=require("node:fs");Pm();Em();_T="godd_config",vT="config.godd \u306E\u8868\u793A\u30FB\u66F4\u65B0\u3092\u884C\u3044\u307E\u3059\u3002show \u3067\u73FE\u5728\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3001update \u3067\u6307\u5B9A\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u66F4\u65B0\u3057\u307E\u3059\u3002GODD_CONFIG \u74B0\u5883\u5909\u6570\u3067\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",bT=g.object({action:g.enum(["show","update"]).describe("show=\u73FE\u5728\u306E\u8A2D\u5B9A\u3092\u8868\u793A, update=\u8A2D\u5B9A\u3092\u66F4\u65B0"),license_key:g.string().min(1,"license_key \u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093").max(1e3).optional().describe("\u66F4\u65B0\u3059\u308B\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\uFF08action=update \u6642\u306E\u307F\uFF09"),components:g.array(g.string().min(1).max(1e3)).min(1,"components \u306F\u7A7A\u914D\u5217\u306B\u3067\u304D\u307E\u305B\u3093").optional().describe("\u66F4\u65B0\u3059\u308B\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u914D\u5217\uFF08action=update \u6642\u306E\u307F\uFF09"),language:g.string().min(1,"language \u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093").max(1e3).optional().describe("\u66F4\u65B0\u3059\u308B\u8A00\u8A9E\uFF08action=update \u6642\u306E\u307F\uFF09"),registry_url:g.string().min(1,"registry_url \u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093").url("registry_url \u306F\u6709\u52B9\u306A URL \u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093").max(1e3).optional().describe("\u66F4\u65B0\u3059\u308B Registry URL\uFF08action=update \u6642\u306E\u307F\uFF09")})});function zg(e){Ig=e}function kT(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Buffer.from(t,"base64")}function Ag(e){return c5.test(e.trim())}function u5(e){let t=e.trim();if(Ag(t))throw new $t("Registry \u767A\u884C\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F Registry API \u3067\u691C\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044");let r=t.split(".");if(r.length!==2)throw new $t("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306E\u5F62\u5F0F\u304C\u4E0D\u6B63\u3067\u3059");let[n,o]=r;if(Ig){let c=(0,Du.createPublicKey)(Ig),u=kT(o);if(!(0,Du.verify)(null,Buffer.from(n),c,u))throw new $t("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306E\u7F72\u540D\u304C\u7121\u52B9\u3067\u3059")}else if(process.env.SKIP_LICENSE_VERIFY!=="true")throw new $t("\u516C\u958B\u9375\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u304C\u3067\u304D\u307E\u305B\u3093");let i=kT(n).toString("utf-8"),s;try{s=JSON.parse(i)}catch{throw new $t("\u30E9\u30A4\u30BB\u30F3\u30B9\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u89E3\u6790\u306B\u5931\u6557\u3057\u307E\u3057\u305F")}if(s.v!==1)throw new $t(`\u672A\u5BFE\u5FDC\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30D0\u30FC\u30B8\u30E7\u30F3: ${s.v}`);let a=new Date(s.exp);if(isNaN(a.getTime()))throw new $t("\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u304C\u4E0D\u6B63\u3067\u3059");if(a<new Date)throw new $t(`\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u3066\u3044\u307E\u3059\uFF08${s.exp}\uFF09`);return s}function Rg(e,t){let r=u5(e);if(r.stack&&r.stack!==t)throw new $t(`\u3053\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u306F\u30B9\u30BF\u30C3\u30AF '${r.stack}' \u5C02\u7528\u3067\u3059\uFF08\u8981\u6C42: '${t}'\uFF09`);return r}var Du,c5,Ig,$t,ST=_(()=>{"use strict";Du=require("node:crypto"),c5=/^godd-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Ig="";$t=class extends Error{constructor(t){super(t),this.name="LicenseError"}}});var TT={};Br(TT,{startServer:()=>$T});function l5(){try{let e=(0,ir.join)(qr,"..","package.json");return JSON.parse((0,ao.readFileSync)(e,"utf-8")).version??"0.0.0"}catch{return"0.0.0"}}async function p5(e){let t=e.components??[];if(t.length===0)return null;let r=await C1(t,e.language,e.license_key);if(r&&!r.isExpired){console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F");try{let n=JSON.parse(r.data);return Ls(n),n}catch{console.error("[GoDD] \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002Registry API \u304B\u3089\u518D\u30D5\u30A7\u30C3\u30C1\u3057\u307E\u3059")}}try{let n=E1(t,e.language),o=await w1(e,n);if(o===null&&r){console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306F\u30AD\u30E3\u30C3\u30B7\u30E5\u3068\u540C\u4E00\u3067\u3059\uFF08304\uFF09");try{let i=JSON.parse(r.data);return Ls(i),i}catch{console.error("[GoDD] 304 \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F")}}if(o){let i=await k1(o.bundle,e.license_key);Ls(i);let s=JSON.stringify(i);return await P1(s,o.etag,t,e.language,e.license_key),console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092 Registry API \u304B\u3089\u30D5\u30A7\u30C3\u30C1\u3057\u307E\u3057\u305F"),i}}catch(n){console.error(`[GoDD] Registry API \u3078\u306E\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${Ne(n)}`)}if(r){console.error("[GoDD] \u8B66\u544A: \u671F\u9650\u5207\u308C\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\uFF08Registry API \u5230\u9054\u4E0D\u80FD\uFF09");try{let n=JSON.parse(r.data);return Ls(n),n}catch{console.error("[GoDD] \u671F\u9650\u5207\u308C\u30AD\u30E3\u30C3\u30B7\u30E5\u306E JSON \u30D1\u30FC\u30B9\u306B\u3082\u5931\u6557\u3057\u307E\u3057\u305F")}}return null}async function $T(){let e=kk(),t=e.components&&e.components.length>0,r;if(t){try{let d=await x1(e);d.valid||(console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC: ${d.error??"\u4E0D\u660E\u306A\u30A8\u30E9\u30FC"}`),process.exit(1))}catch(d){console.error(`[GoDD] Registry \u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u5931\u6557\u3002\u30ED\u30FC\u30AB\u30EB\u691C\u8A3C\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: ${Ne(d)}`),Ag(e.license_key)&&(console.error("[GoDD] Registry \u767A\u884C\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F\u30ED\u30FC\u30AB\u30EB\u7F72\u540D\u691C\u8A3C\u3067\u304D\u307E\u305B\u3093\u3002registry_url \u3068\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u63A5\u7D9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1));let f=(0,ir.join)(qr,"..",".keys","public.pem");(0,ao.existsSync)(f)&&zg((0,ao.readFileSync)(f,"utf-8"));try{let h=e.components?.[0]??e.stack_profile??"fastapi-react";Rg(e.license_key,h)}catch(h){h instanceof $t?console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC (\u30ED\u30FC\u30AB\u30EB\u691C\u8A3C): ${h.message}`):console.error(`[GoDD] \u30ED\u30FC\u30AB\u30EB\u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u3067\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC: ${Ne(h)}`),process.exit(1)}}try{await Cg(e.registry_url,e.license_key)}catch(d){console.error("\u30EA\u30DD\u30B8\u30C8\u30EA\u691C\u8A3C\u30A8\u30E9\u30FC:",Ne(d)),console.error(" godd init \u3092\u518D\u5B9F\u884C\u3059\u308B\u304B\u3001Registry API \u304C\u8D77\u52D5\u3057\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1)}let l=await p5(e);if(l)r={name:`registry:${e.components.join("+")}`,stacks:e.components.map(d=>({id:d,label:d,name:d})),quality_gate:l.quality_gate?{frontend:l.quality_gate.frontend,backend:l.quality_gate.backend,preflight_command:l.quality_gate.preflight??"pnpm preflight",summary:"format/lint/typecheck/build"}:void 0,tools:l.tools?.map(d=>({id:d.id,label:d.label,category:d.category,description:d.description,guidance:d.guidance}))};else{console.error("[GoDD] Registry/\u30AD\u30E3\u30C3\u30B7\u30E5\u5229\u7528\u4E0D\u53EF\u3002\u30ED\u30FC\u30AB\u30EB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF"),kg((0,ir.join)(qr,"..","templates"));let d=e.stack_profile??"fastapi-react";try{r=Cm(d,(0,ir.join)(qr,"..","stacks"))}catch(f){console.error(`[GoDD] \u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${d}' \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${Ne(f)}`),console.error("[GoDD] \u6700\u5C0F\u9650\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u8D77\u52D5\u3057\u307E\u3059"),r={name:d,stacks:[]}}}}else{let l=(0,ir.join)(qr,"..",".keys","public.pem");(0,ao.existsSync)(l)&&zg((0,ao.readFileSync)(l,"utf-8"));try{Rg(e.license_key,e.stack_profile??"fastapi-react")}catch(h){h instanceof $t&&(console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC: ${h.message}`),process.exit(1)),console.error(`[GoDD] \u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u3067\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC: ${Ne(h)}`),process.exit(1)}let d=e.stack_profile??"fastapi-react";try{r=Cm(d,(0,ir.join)(qr,"..","stacks"))}catch(h){console.error(`[GoDD] \u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${d}' \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${Ne(h)}`),console.error("[GoDD] \u6700\u5C0F\u9650\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u8D77\u52D5\u3057\u307E\u3059"),r={name:d,stacks:[]}}await y1(e.license_key)||kg((0,ir.join)(qr,"..","templates"))}let n={profile:r,config:e},o=new qc({name:"godd-mcp-server",version:l5()});async function i(l){return t&&await N1(e.registry_url,e.license_key),l()}let s=[];function a(l,d,f,h){let m=f.shape;o.tool(l,d,m,async y=>({content:[{type:"text",text:await i(()=>h(n,f.parse(y)))}]})),s.push({name:l,description:d,params:Object.keys(m)})}function c(l,d,f,h){let m=f.shape;o.tool(l,d,m,async y=>({content:[{type:"text",text:await h(f.parse(y))}]})),s.push({name:l,description:d,params:Object.keys(m)})}a(L1,Z1,q1,F1),a(B1,H1,V1,G1),a(K1,J1,Y1,Q1),a(e2,t2,r2,n2),a(i2,s2,a2,c2),a(l2,p2,d2,f2),a(m2,g2,y2,_2),a(b2,x2,w2,k2),a($2,T2,P2,C2),a(I2,z2,A2,R2),a(N2,D2,j2,M2),a(Z2,q2,F2,U2),a(H2,V2,G2,W2),a(J2,Y2,Q2,X2),a(t$,r$,n$,o$),a(s$,a$,c$,u$),a(p$,d$,f$,h$),a(g$,y$,_$,v$),a(x$,w$,k$,S$),a(T$,P$,C$,E$),a(z$,A$,R$,O$),a(D$,j$,M$,L$),a(q$,F$,U$,B$),a(V$,G$,W$,K$),a(Y$,Q$,X$,eT),a(rT,nT,oT,iT),a(aT,cT,uT,lT),a(dT,fT,hT,mT),c(_T,vT,bT,xT);for(let l of s)o.prompt(l.name,l.description,()=>({messages:[{role:"user",content:{type:"text",text:`\`${l.name}\` \u30C4\u30FC\u30EB\u3092\u4ECA\u3059\u3050\u547C\u3073\u51FA\u3057\u3066\u304F\u3060\u3055\u3044\u3002`}}]}));let u=r?.tools??[];u.length>0&&o.resource("ecosystem-tool",new _s("godd://tools/{toolId}",{list:async()=>({resources:u.map(l=>({uri:`godd://tools/${l.id}`,name:l.label,description:l.description,mimeType:"text/plain"}))})}),async(l,{toolId:d})=>{let f=u.find(m=>m.id===String(d));if(!f)return{contents:[{uri:l.href,text:"Tool not found"}]};let h=[`# ${f.label}`,"",`- **\u30AB\u30C6\u30B4\u30EA**: ${f.category}`,`- **\u8AAC\u660E**: ${f.description}`];return f.guidance&&h.push("","## \u5229\u7528\u30AC\u30A4\u30C0\u30F3\u30B9","",f.guidance),"url"in f&&f.url&&h.push("",`- **\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8**: ${f.url}`),{contents:[{uri:l.href,text:h.join(`
|
|
260
260
|
`),mimeType:"text/plain"}]}}),o.resource("mcp-tool",new _s("godd://mcp-tools/{toolName}",{list:async()=>({resources:s.map(l=>({uri:`godd://mcp-tools/${l.name}`,name:l.name,description:l.description,mimeType:"text/plain"}))})}),async(l,{toolName:d})=>{let f=s.find(m=>m.name===String(d));if(!f)return{contents:[{uri:l.href,text:"Tool not found"}]};let h=[`# ${f.name}`,"",f.description,"","## \u30D1\u30E9\u30E1\u30FC\u30BF","",...f.params.map(m=>`- \`${m}\``)];return{contents:[{uri:l.href,text:h.join(`
|
|
261
|
-
`),mimeType:"text/plain"}]}});let p=new Uc;await o.connect(p)}var ir,Og,ao,PT,qr,d5,CT=_(()=>{"use strict";fw();gw();Em();Ko();_1();S1();I1();z1();D1();U1();W1();X1();o2();u2();h2();v2();S2();E2();O2();L2();B2();K2();e$();i$();l$();m$();b$();$$();I$();N$();Z$();H$();J$();tT();sT();pT();gT();wT();ST();ir=require("node:path"),Og=require("node:url"),ao=require("node:fs"),PT={};try{qr=(0,ir.dirname)((0,Og.fileURLToPath)(PT.url))}catch{qr=(0,ir.dirname)(process.execPath)}d5=(()=>{try{let e=(0,Og.fileURLToPath)(PT.url);return process.argv[1]===e}catch{return!process.env.__GODD_CLI__}})();d5&&$T().catch(e=>{console.error("GoDD MCP Server \u8D77\u52D5\u30A8\u30E9\u30FC:",e),process.exit(1)})});var OT={};Br(OT,{buildMcpServerEntry:()=>Ng,runInit:()=>RT});function ai(e){return new Promise(t=>{AT.question(e,r=>t(r.trim()))})}function f5(e){let t=new Map;for(let n of e){let o=g5[n.name]??n.category,i=t.get(o)??[];i.push(n),t.set(o,i)}return["language","frontend-ui","frontend-css","frontend-build","frontend","backend-api","backend-orm","backend-task","backend","runtime","database","infra","architecture"].filter(n=>t.has(n)).map(n=>({category:n,components:t.get(n)}))}function y5(e,t){let r=m5[e];return r===void 0||r.length===0?!0:r.some(n=>t.has(n))}function _5(){return!!process.pkg}async function v5(e,t){try{let r=await fetch(`${e}/v1/components`,{headers:{Authorization:`Bearer ${t}`}});return r.ok?await r.json():null}catch{return null}}function b5(e,t,r,n){return["# GoDD MCP Server Configuration","# Generated by godd-init","",`license_key: "${e}"`,"","# \u6280\u8853\u30B9\u30BF\u30C3\u30AF\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8","components:",...t.map(i=>` - ${i}`),"",`language: "${r}"`,"","# Registry API URL (default: production endpoint)"
|
|
262
|
-
`)}function Ng(e){if(_5())return{command:"godd",args:["server"],env:{GODD_CONFIG:e}};let t;try{t=(0,Dg.fileURLToPath)(NT.url)}catch{typeof __filename<"u"?t=__filename:(t=process.argv[1]??process.execPath,console.warn(`[GoDD] import.meta.url / __filename \u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002process.argv[1] \u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: ${t}`))}let r=(0,Tt.dirname)(t),n=t.includes("src")?(0,Tt.resolve)(r,"..","..","dist","godd.js"):(0,Tt.resolve)(r,"godd.js");return{command:process.execPath,args:[n,"server"],env:{GODD_CONFIG:e}}}async function RT(){console.log(""),console.log("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"),console.log("\u2551 GoDD MCP Server \u2014 \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7 \u2551"),console.log("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"),console.log("");let e=await ai("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: ");e||(console.error("\u30A8\u30E9\u30FC: \u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F\u5FC5\u9808\u3067\u3059\u3002"),process.exit(1));let r=await ai("\u4F7F\u7528\u8A00\u8A9E\u3092\u9078\u629E [ja/en/zh/ru/kz/tr] (default: ja): ")||"ja",o=await ai("Registry API URL (default:
|
|
261
|
+
`),mimeType:"text/plain"}]}});let p=new Uc;await o.connect(p)}var ir,Og,ao,PT,qr,d5,CT=_(()=>{"use strict";fw();gw();Em();Ko();_1();S1();I1();z1();D1();U1();W1();X1();o2();u2();h2();v2();S2();E2();O2();L2();B2();K2();e$();i$();l$();m$();b$();$$();I$();N$();Z$();H$();J$();tT();sT();pT();gT();wT();ST();ir=require("node:path"),Og=require("node:url"),ao=require("node:fs"),PT={};try{qr=(0,ir.dirname)((0,Og.fileURLToPath)(PT.url))}catch{qr=(0,ir.dirname)(process.execPath)}d5=(()=>{try{let e=(0,Og.fileURLToPath)(PT.url);return process.argv[1]===e}catch{return!process.env.__GODD_CLI__}})();d5&&$T().catch(e=>{console.error("GoDD MCP Server \u8D77\u52D5\u30A8\u30E9\u30FC:",e),process.exit(1)})});var OT={};Br(OT,{buildMcpServerEntry:()=>Ng,runInit:()=>RT});function ai(e){return new Promise(t=>{AT.question(e,r=>t(r.trim()))})}function f5(e){let t=new Map;for(let n of e){let o=g5[n.name]??n.category,i=t.get(o)??[];i.push(n),t.set(o,i)}return["language","frontend-ui","frontend-css","frontend-build","frontend","backend-api","backend-orm","backend-task","backend","runtime","database","infra","architecture"].filter(n=>t.has(n)).map(n=>({category:n,components:t.get(n)}))}function y5(e,t){let r=m5[e];return r===void 0||r.length===0?!0:r.some(n=>t.has(n))}function _5(){return!!process.pkg}async function v5(e,t){try{let r=await fetch(`${e}/v1/components`,{headers:{Authorization:`Bearer ${t}`}});return r.ok?await r.json():null}catch{return null}}function b5(e,t,r,n){return["# GoDD MCP Server Configuration","# Generated by godd-init","",`license_key: "${e}"`,"","# \u6280\u8853\u30B9\u30BF\u30C3\u30AF\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8","components:",...t.map(i=>` - ${i}`),"",`language: "${r}"`,"","# Registry API URL (default: production endpoint)",`registry_url: "${n}"`,""].join(`
|
|
262
|
+
`)}function Ng(e){if(_5())return{command:"godd",args:["server"],env:{GODD_CONFIG:e}};let t;try{t=(0,Dg.fileURLToPath)(NT.url)}catch{typeof __filename<"u"?t=__filename:(t=process.argv[1]??process.execPath,console.warn(`[GoDD] import.meta.url / __filename \u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002process.argv[1] \u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: ${t}`))}let r=(0,Tt.dirname)(t),n=t.includes("src")?(0,Tt.resolve)(r,"..","..","dist","godd.js"):(0,Tt.resolve)(r,"godd.js");return{command:process.execPath,args:[n,"server"],env:{GODD_CONFIG:e}}}async function RT(){console.log(""),console.log("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"),console.log("\u2551 GoDD MCP Server \u2014 \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7 \u2551"),console.log("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"),console.log("");let e=await ai("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: ");e||(console.error("\u30A8\u30E9\u30FC: \u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F\u5FC5\u9808\u3067\u3059\u3002"),process.exit(1));let r=await ai("\u4F7F\u7528\u8A00\u8A9E\u3092\u9078\u629E [ja/en/zh/ru/kz/tr] (default: ja): ")||"ja",o=await ai("Registry API URL (default: https://dev.api.godd.ripla-inc.com): ")||"https://dev.api.godd.ripla-inc.com",i=Zs();i||(console.error(`
|
|
263
263
|
\u30A8\u30E9\u30FC: Git \u30EA\u30E2\u30FC\u30C8 (origin) \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002`),console.error(" git remote add origin <url> \u3067\u30EA\u30E2\u30FC\u30C8\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1)),console.log(`
|
|
264
264
|
\u30EA\u30DD\u30B8\u30C8\u30EA\u3092\u767B\u9332\u4E2D: ${i}`);try{let T=await fetch(`${o}/v1/repos/register`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({remote_url:i}),signal:AbortSignal.timeout(1e4)});if(!T.ok){let U=await T.json().catch(()=>({detail:T.statusText}));console.error(`
|
|
265
265
|
\u30A8\u30E9\u30FC: \u30EA\u30DD\u30B8\u30C8\u30EA\u767B\u9332\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002`),console.error(` ${U.detail??T.statusText}`),T.status===401?console.error(" \u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u304C\u7121\u52B9\u3067\u3059\u3002"):T.status===403&&console.error(" \u30EA\u30DD\u30B8\u30C8\u30EA\u6570\u306E\u4E0A\u9650\u306B\u9054\u3057\u3066\u3044\u307E\u3059\u3002\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1)}console.log("\u2713 \u30EA\u30DD\u30B8\u30C8\u30EA\u3092\u767B\u9332\u3057\u307E\u3057\u305F")}catch{console.error(`
|
package/dist/godd.js
CHANGED
|
@@ -24513,7 +24513,7 @@ var init_schema = __esm({
|
|
|
24513
24513
|
components: external_exports.array(external_exports.string().min(1, "\u7A7A\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u540D\u306F\u7121\u52B9\u3067\u3059")).optional(),
|
|
24514
24514
|
language: external_exports.string().default("en"),
|
|
24515
24515
|
/** GoDD Registry API URL. Defaults to the production endpoint. */
|
|
24516
|
-
registry_url: external_exports.string().default("https://godd-
|
|
24516
|
+
registry_url: external_exports.string().default("https://dev.api.godd.ripla-inc.com")
|
|
24517
24517
|
}).refine(
|
|
24518
24518
|
(data) => data.stack_profile !== void 0 || data.components !== void 0 && data.components.length > 0,
|
|
24519
24519
|
{ message: "Either 'stack_profile' or 'components' must be provided" }
|
|
@@ -33076,6 +33076,23 @@ async function startServer() {
|
|
|
33076
33076
|
registerGuardedTool(docsUpdateToolName, docsUpdateToolDescription, docsUpdateToolInputSchema, handleDocsUpdateTool);
|
|
33077
33077
|
registerGuardedTool(notesDeployToolName, notesDeployToolDescription, notesDeployToolInputSchema, handleNotesDeployTool);
|
|
33078
33078
|
registerTool(configToolName, configToolDescription, configToolInputSchema, handleConfigTool);
|
|
33079
|
+
for (const tool of registeredTools) {
|
|
33080
|
+
server.prompt(
|
|
33081
|
+
tool.name,
|
|
33082
|
+
tool.description,
|
|
33083
|
+
() => ({
|
|
33084
|
+
messages: [
|
|
33085
|
+
{
|
|
33086
|
+
role: "user",
|
|
33087
|
+
content: {
|
|
33088
|
+
type: "text",
|
|
33089
|
+
text: `\`${tool.name}\` \u30C4\u30FC\u30EB\u3092\u4ECA\u3059\u3050\u547C\u3073\u51FA\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
|
|
33090
|
+
}
|
|
33091
|
+
}
|
|
33092
|
+
]
|
|
33093
|
+
})
|
|
33094
|
+
);
|
|
33095
|
+
}
|
|
33079
33096
|
const ecosystemTools = profile?.tools ?? [];
|
|
33080
33097
|
if (ecosystemTools.length > 0) {
|
|
33081
33098
|
server.resource(
|
|
@@ -33299,7 +33316,7 @@ function generateConfigYaml(licenseKey, components, language, registryUrl) {
|
|
|
33299
33316
|
`language: "${language}"`,
|
|
33300
33317
|
"",
|
|
33301
33318
|
"# Registry API URL (default: production endpoint)",
|
|
33302
|
-
|
|
33319
|
+
`registry_url: "${registryUrl}"`,
|
|
33303
33320
|
""
|
|
33304
33321
|
];
|
|
33305
33322
|
return lines.join("\n");
|
|
@@ -33349,9 +33366,9 @@ async function runInit() {
|
|
|
33349
33366
|
);
|
|
33350
33367
|
const language = langInput || "ja";
|
|
33351
33368
|
const registryUrlInput = await ask(
|
|
33352
|
-
"Registry API URL (default:
|
|
33369
|
+
"Registry API URL (default: https://dev.api.godd.ripla-inc.com): "
|
|
33353
33370
|
);
|
|
33354
|
-
const registryUrl = registryUrlInput || "
|
|
33371
|
+
const registryUrl = registryUrlInput || "https://dev.api.godd.ripla-inc.com";
|
|
33355
33372
|
const remoteUrl = getGitRemoteUrl();
|
|
33356
33373
|
if (!remoteUrl) {
|
|
33357
33374
|
console.error("\n\u30A8\u30E9\u30FC: Git \u30EA\u30E2\u30FC\u30C8 (origin) \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002");
|
package/dist/index.js
CHANGED
|
@@ -93,7 +93,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
93
93
|
`+e.slice(o,i),o=i+1),s=a;return c+=`
|
|
94
94
|
`,e.length-o>t&&s>o?c+=e.slice(o,s)+`
|
|
95
95
|
`+e.slice(s+1):c+=e.slice(o),c.slice(1)}function aN(e){for(var t="",r=0,n,o=0;o<e.length;r>=65536?o+=2:o++)r=Oi(e,o),n=Ue[r],!n&&Di(r)?(t+=e[o],r>=65536&&(t+=e[o+1])):t+=n||QO(r);return t}function cN(e,t,r){var n="",o=e.tag,i,s,a;for(i=0,s=r.length;i<s;i+=1)a=r[i],e.replacer&&(a=e.replacer.call(r,String(i),a)),(cr(e,t,a,!1,!1)||typeof a>"u"&&cr(e,t,null,!1,!1))&&(n!==""&&(n+=","+(e.condenseFlow?"":" ")),n+=e.dump);e.tag=o,e.dump="["+n+"]"}function B0(e,t,r,n){var o="",i=e.tag,s,a,c;for(s=0,a=r.length;s<a;s+=1)c=r[s],e.replacer&&(c=e.replacer.call(r,String(s),c)),(cr(e,t+1,c,!0,!0,!1,!0)||typeof c>"u"&&cr(e,t+1,null,!0,!0,!1,!0))&&((!n||o!=="")&&(o+=Sf(e,t)),e.dump&&ji===e.dump.charCodeAt(0)?o+="-":o+="- ",o+=e.dump);e.tag=i,e.dump=o||"[]"}function uN(e,t,r){var n="",o=e.tag,i=Object.keys(r),s,a,c,u,p;for(s=0,a=i.length;s<a;s+=1)p="",n!==""&&(p+=", "),e.condenseFlow&&(p+='"'),c=i[s],u=r[c],e.replacer&&(u=e.replacer.call(r,c,u)),cr(e,t,c,!1,!1)&&(e.dump.length>1024&&(p+="? "),p+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),cr(e,t,u,!1,!1)&&(p+=e.dump,n+=p));e.tag=o,e.dump="{"+n+"}"}function lN(e,t,r,n){var o="",i=e.tag,s=Object.keys(r),a,c,u,p,l,d;if(e.sortKeys===!0)s.sort();else if(typeof e.sortKeys=="function")s.sort(e.sortKeys);else if(e.sortKeys)throw new We("sortKeys must be a boolean or a function");for(a=0,c=s.length;a<c;a+=1)d="",(!n||o!=="")&&(d+=Sf(e,t)),u=s[a],p=r[u],e.replacer&&(p=e.replacer.call(r,u,p)),cr(e,t+1,u,!0,!0,!0)&&(l=e.tag!==null&&e.tag!=="?"||e.dump&&e.dump.length>1024,l&&(e.dump&&ji===e.dump.charCodeAt(0)?d+="?":d+="? "),d+=e.dump,l&&(d+=Sf(e,t)),cr(e,t+1,p,!0,l)&&(e.dump&&ji===e.dump.charCodeAt(0)?d+=":":d+=": ",d+=e.dump,o+=d));e.tag=i,e.dump=o||"{}"}function V0(e,t,r){var n,o,i,s,a,c;for(o=r?e.explicitTypes:e.implicitTypes,i=0,s=o.length;i<s;i+=1)if(a=o[i],(a.instanceOf||a.predicate)&&(!a.instanceOf||typeof t=="object"&&t instanceof a.instanceOf)&&(!a.predicate||a.predicate(t))){if(r?a.multi&&a.representName?e.tag=a.representName(t):e.tag=a.tag:e.tag="?",a.represent){if(c=e.styleMap[a.tag]||a.defaultStyle,wx.call(a.represent)==="[object Function]")n=a.represent(t,c);else if(Sx.call(a.represent,c))n=a.represent[c](t,c);else throw new We("!<"+a.tag+'> tag resolver accepts not "'+c+'" style');e.dump=n}return!0}return!1}function cr(e,t,r,n,o,i,s){e.tag=null,e.dump=r,V0(e,r,!1)||V0(e,r,!0);var a=wx.call(e.dump),c=n,u;n&&(n=e.flowLevel<0||e.flowLevel>t);var p=a==="[object Object]"||a==="[object Array]",l,d;if(p&&(l=e.duplicates.indexOf(r),d=l!==-1),(e.tag!==null&&e.tag!=="?"||d||e.indent!==2&&t>0)&&(o=!1),d&&e.usedDuplicates[l])e.dump="*ref_"+l;else{if(p&&d&&!e.usedDuplicates[l]&&(e.usedDuplicates[l]=!0),a==="[object Object]")n&&Object.keys(e.dump).length!==0?(lN(e,t,e.dump,o),d&&(e.dump="&ref_"+l+e.dump)):(uN(e,t,e.dump),d&&(e.dump="&ref_"+l+" "+e.dump));else if(a==="[object Array]")n&&e.dump.length!==0?(e.noArrayIndent&&!s&&t>0?B0(e,t-1,e.dump,o):B0(e,t,e.dump,o),d&&(e.dump="&ref_"+l+e.dump)):(cN(e,t,e.dump),d&&(e.dump="&ref_"+l+" "+e.dump));else if(a==="[object String]")e.tag!=="?"&&iN(e,e.dump,t,i,c);else{if(a==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new We("unacceptable kind of an object to dump "+a)}e.tag!==null&&e.tag!=="?"&&(u=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?u="!"+u:u.slice(0,18)==="tag:yaml.org,2002:"?u="!!"+u.slice(18):u="!<"+u+">",e.dump=u+" "+e.dump)}return!0}function pN(e,t){var r=[],n=[],o,i;for($f(e,r,n),o=0,i=n.length;o<i;o+=1)t.duplicates.push(r[n[o]]);t.usedDuplicates=new Array(i)}function $f(e,t,r){var n,o,i;if(e!==null&&typeof e=="object")if(o=t.indexOf(e),o!==-1)r.indexOf(o)===-1&&r.push(o);else if(t.push(e),Array.isArray(e))for(o=0,i=e.length;o<i;o+=1)$f(e[o],t,r);else for(n=Object.keys(e),o=0,i=n.length;o<i;o+=1)$f(e[n[o]],t,r)}function dN(e,t){t=t||{};var r=new eN(t);r.noRefs||pN(e,r);var n=e;return r.replacer&&(n=r.replacer.call({"":n},"",n)),cr(r,0,n,!0,!0)?r.dump+`
|
|
96
|
-
`:""}var fN=dN,hN={dump:fN};function Rf(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var mN=Me,gN=K0,_N=Q0,yN=nx,vN=ox,xN=Ef,bN=kx.load,kN=kx.loadAll,wN=hN.dump,SN=We,TN={binary:ux,float:rx,map:Y0,null:X0,pairs:px,set:dx,timestamp:ax,bool:ex,int:tx,merge:cx,omap:lx,seq:J0,str:W0},$N=Rf("safeLoad","load"),PN=Rf("safeLoadAll","loadAll"),EN=Rf("safeDump","dump"),Dr={Type:mN,Schema:gN,FAILSAFE_SCHEMA:_N,JSON_SCHEMA:yN,CORE_SCHEMA:vN,DEFAULT_SCHEMA:xN,load:bN,loadAll:kN,dump:wN,YAMLException:SN,types:TN,safeLoad:$N,safeLoadAll:PN,safeDump:EN};var zN=m.object({id:m.string(),label:m.string(),name:m.string(),mindset_template:m.string().optional()}),CN=m.object({name:m.string(),root_dir:m.string().default("frontend"),build_command:m.string(),package_manager:m.string().default("pnpm"),mindset_template:m.string().optional()}),IN=m.object({name:m.string(),root_dir:m.string().default("backend"),architecture:m.string(),dependency_direction:m.string(),package_manager:m.string().default("uv"),mindset_template:m.string().optional()}),RN=m.object({frontend:m.string().optional(),backend:m.string().optional(),preflight_command:m.string().default("pnpm preflight"),summary:m.string().default("format/lint/typecheck/build")}),AN=m.object({name:m.string(),description:m.string(),runtime:m.enum(["python","node","unknown"]).default("unknown"),setup_hint:m.string().optional(),enabled:m.boolean().default(!0)}),ON=m.object({id:m.string(),label:m.string(),category:m.enum(["frontend","backend","testing","infra","devtool","monitoring"]),description:m.string(),url:m.string().optional(),guidance:m.string().optional()}),Ox=m.object({name:m.string(),description:m.string().optional(),stacks:m.array(zN),frontend:CN.optional(),backend:IN.optional(),quality_gate:RN.optional(),vendor:m.array(AN).optional(),tools:m.array(ON).optional()}),Nx=m.object({license_key:m.string().min(1,"license_key \u306F\u5FC5\u9808\u3067\u3059"),stack_profile:m.string().optional(),components:m.array(m.string().min(1,"\u7A7A\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u540D\u306F\u7121\u52B9\u3067\u3059")).optional(),language:m.string().default("en"),registry_url:m.string().default("https://godd-
|
|
96
|
+
`:""}var fN=dN,hN={dump:fN};function Rf(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var mN=Me,gN=K0,_N=Q0,yN=nx,vN=ox,xN=Ef,bN=kx.load,kN=kx.loadAll,wN=hN.dump,SN=We,TN={binary:ux,float:rx,map:Y0,null:X0,pairs:px,set:dx,timestamp:ax,bool:ex,int:tx,merge:cx,omap:lx,seq:J0,str:W0},$N=Rf("safeLoad","load"),PN=Rf("safeLoadAll","loadAll"),EN=Rf("safeDump","dump"),Dr={Type:mN,Schema:gN,FAILSAFE_SCHEMA:_N,JSON_SCHEMA:yN,CORE_SCHEMA:vN,DEFAULT_SCHEMA:xN,load:bN,loadAll:kN,dump:wN,YAMLException:SN,types:TN,safeLoad:$N,safeLoadAll:PN,safeDump:EN};var zN=m.object({id:m.string(),label:m.string(),name:m.string(),mindset_template:m.string().optional()}),CN=m.object({name:m.string(),root_dir:m.string().default("frontend"),build_command:m.string(),package_manager:m.string().default("pnpm"),mindset_template:m.string().optional()}),IN=m.object({name:m.string(),root_dir:m.string().default("backend"),architecture:m.string(),dependency_direction:m.string(),package_manager:m.string().default("uv"),mindset_template:m.string().optional()}),RN=m.object({frontend:m.string().optional(),backend:m.string().optional(),preflight_command:m.string().default("pnpm preflight"),summary:m.string().default("format/lint/typecheck/build")}),AN=m.object({name:m.string(),description:m.string(),runtime:m.enum(["python","node","unknown"]).default("unknown"),setup_hint:m.string().optional(),enabled:m.boolean().default(!0)}),ON=m.object({id:m.string(),label:m.string(),category:m.enum(["frontend","backend","testing","infra","devtool","monitoring"]),description:m.string(),url:m.string().optional(),guidance:m.string().optional()}),Ox=m.object({name:m.string(),description:m.string().optional(),stacks:m.array(zN),frontend:CN.optional(),backend:IN.optional(),quality_gate:RN.optional(),vendor:m.array(AN).optional(),tools:m.array(ON).optional()}),Nx=m.object({license_key:m.string().min(1,"license_key \u306F\u5FC5\u9808\u3067\u3059"),stack_profile:m.string().optional(),components:m.array(m.string().min(1,"\u7A7A\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u540D\u306F\u7121\u52B9\u3067\u3059")).optional(),language:m.string().default("en"),registry_url:m.string().default("https://dev.api.godd.ripla-inc.com")}).refine(e=>e.stack_profile!==void 0||e.components!==void 0&&e.components.length>0,{message:"Either 'stack_profile' or 'components' must be provided"});var jN=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/,St="config.godd";function Lx(e){let t=e??process.env.GODD_CONFIG;if(!t)throw new Error(`${St} \u306E\u30D1\u30B9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002GODD_CONFIG \u74B0\u5883\u5909\u6570\u3092\u8A2D\u5B9A\u3059\u308B\u304B\u3001\u660E\u793A\u7684\u306B\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);if(!Dx(t))throw new Error(`${St} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${t}
|
|
97
97
|
GODD_CONFIG \u74B0\u5883\u5909\u6570\u307E\u305F\u306F .cursor/mcp.json \u306E env.GODD_CONFIG \u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let r=Mx(t,"utf-8"),n=Dr.load(r);return Nx.parse(n)}function MN(e){let t=Dr.load(e);return Ox.parse(t)}function Af(e,t){if(!jN.test(e))throw new Error(`\u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u540D\u304C\u4E0D\u6B63\u3067\u3059: '${e}' \u2014 \u82F1\u6570\u5B57\u30FB\u30CF\u30A4\u30D5\u30F3\u30FB\u30C9\u30C3\u30C8\u30FB\u30A2\u30F3\u30C0\u30FC\u30B9\u30B3\u30A2\u306E\u307F\u4F7F\u7528\u53EF\u80FD\u3067\u3059\u3002`);let r=t??NN(process.cwd(),"stacks"),n=jx(r,`${e}.yaml`);if(!n.startsWith(jx(r)))throw new Error(`\u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9\u304C\u4E0D\u6B63\u3067\u3059: '${e}'`);if(!Dx(n))throw new Error(`\u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${e}' \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${n}`);let o=Mx(n,"utf-8");return MN(o)}function st(e){return e instanceof Error?e.message:String(e)}import{readFileSync as IM,readdirSync as RM,existsSync as AM}from"node:fs";import{join as $o,basename as OM}from"node:path";import{createDecipheriv as NM}from"node:crypto";var Oc=Zc(Ck(),1);Oc.default.registerHelper("eq",function(e,t){return e===t});var Th=new Map,zM=new Map;function Qi(e,t){Oc.default.registerPartial(e,t)}function fr(e,t){zM.set(e,t),Th.set(e,Oc.default.compile(t))}function CM(e,t){return{profile_name:e.name,stacks:e.stacks,frontend:e.frontend?{...e.frontend,mindset:""}:void 0,backend:e.backend?{...e.backend,mindset:""}:void 0,quality_gate:e.quality_gate,tools:e.tools??[],vendor:e.vendor??[],...t}}function Ik(e,t){let r=Th.get(`mindset:${e}`);return r?r(t):`[Mindset '${e}' not found]`}function Rk(e,t,r){let n=Th.get(`prompt:${e}`);if(!n)throw new Error(`\u30D7\u30ED\u30F3\u30D7\u30C8\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8 '${e}' \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093`);let o=CM(t,r);if(t.frontend?.mindset_template){let i=Ik(t.frontend.mindset_template,o);o.frontend.mindset=i}if(t.backend?.mindset_template){let i=Ik(t.backend.mindset_template,o);o.backend.mindset=i}return n(o)}function Nc(e,t){if(AM(e))for(let r of RM(e)){if(!r.endsWith(".hbs"))continue;let n=OM(r,".hbs");try{let o=IM($o(e,r),"utf-8");t(n,o)}catch(o){console.error(`[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u8AAD\u307F\u8FBC\u307F\u30B9\u30AD\u30C3\u30D7: ${$o(e,r)} \u2014 ${st(o)}`)}}}function $h(e){Nc($o(e,"partials"),(t,r)=>Qi(t,r)),Nc($o(e,"prompts"),(t,r)=>fr(`prompt:${t}`,r)),Nc($o(e,"mindsets"),(t,r)=>fr(`mindset:${t}`,r)),Nc($o(e,"agents"),(t,r)=>fr(`agent:${t}`,r))}async function jM(e,t){let{pbkdf2:r}=await import("node:crypto");return new Promise((n,o)=>{r(e,t,1e5,32,"sha256",(i,s)=>{i?o(i):n(s)})})}async function MM(e,t){let r;try{r=JSON.parse(e)}catch(p){throw new Error(`\u6697\u53F7\u5316\u30D0\u30F3\u30C9\u30EB\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${st(p)}`)}if(r.version!==1)throw new Error(`\u672A\u5BFE\u5FDC\u306E\u30D0\u30F3\u30C9\u30EB\u30D0\u30FC\u30B8\u30E7\u30F3: ${r.version}`);let n=Buffer.from(r.salt,"hex"),o=Buffer.from(r.iv,"hex"),i=Buffer.from(r.tag,"hex"),s=Buffer.from(r.data,"base64"),a=await jM(t,n),c=NM("aes-256-gcm",a,o);c.setAuthTag(i);let u=Buffer.concat([c.update(s),c.final()]);for(let[p,l]of Object.entries(r.templates)){if(!Number.isInteger(l.offset)||!Number.isInteger(l.length)||l.offset<0||l.length<0||l.offset+l.length>u.length)throw new Error(`\u30D0\u30F3\u30C9\u30EB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8 "${p}" \u306E offset/length \u304C\u4E0D\u6B63\u3067\u3059 (offset=${l.offset}, length=${l.length}, bufferSize=${u.length})`);let d=u.subarray(l.offset,l.offset+l.length).toString("utf-8"),h=p.includes(":")?p.split(":").slice(1).join(":"):p;l.type==="partial"?Qi(h,d):fr(`${l.type}:${h}`,d)}}async function Ak(e){return!1}import{createHash as DM}from"node:crypto";import{hostname as LM}from"node:os";function ZM(){let e=`${LM()}-${process.env.USERNAME??process.env.USER??"unknown"}`;return DM("sha256").update(e).digest("hex").slice(0,32)}var qM=m.object({valid:m.boolean(),expires_at:m.string().nullable().optional().default(null),error:m.string().nullable().optional().default(null)});async function Ok(e){let t=`${e.registry_url}/v1/auth/validate`,r=ZM(),n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({license_key:e.license_key,machine_id:r}),signal:AbortSignal.timeout(1e4)});if(!n.ok)throw new Error(`Registry API \u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${n.status} ${n.statusText}`);let o=await n.text(),i;try{i=JSON.parse(o)}catch{throw new Error(`Registry API \u306E\u30EC\u30B9\u30DD\u30F3\u30B9\u304C\u4E0D\u6B63\u306A JSON \u3067\u3059: ${o.slice(0,200)}`)}let s=qM.safeParse(i);if(!s.success)throw new Error(`Registry API \u306E\u30EC\u30B9\u30DD\u30F3\u30B9\u304C\u30B9\u30AD\u30FC\u30DE\u3068\u4E00\u81F4\u3057\u307E\u305B\u3093: ${s.error.message}`);return s.data}var FM=m.object({version:m.number(),salt:m.string(),iv:m.string(),tag:m.string(),data:m.string(),templates:m.record(m.object({type:m.string()}))});async function Nk(e,t){let r=e.components??[];if(r.length===0)return null;let n=new URLSearchParams({components:r.join(","),language:e.language}),o=`${e.registry_url}/v1/bundle?${n.toString()}`,i={Authorization:`Bearer ${e.license_key}`};t&&(i["If-None-Match"]=`"${t}"`);let s=await fetch(o,{headers:i,signal:AbortSignal.timeout(1e4)});if(s.status===304)return null;if(!s.ok){let d=await s.text();throw new Error(`Registry API \u30D0\u30F3\u30C9\u30EB\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${s.status} \u2014 ${d}`)}let a=await s.text(),c;try{c=JSON.parse(a)}catch{throw new Error(`Registry API \u306E\u30D0\u30F3\u30C9\u30EB\u30EC\u30B9\u30DD\u30F3\u30B9\u304C\u4E0D\u6B63\u306A JSON \u3067\u3059: ${a.slice(0,200)}`)}let u=FM.safeParse(c);if(!u.success)throw new Error(`Registry API \u306E\u30D0\u30F3\u30C9\u30EB\u30EC\u30B9\u30DD\u30F3\u30B9\u304C\u30B9\u30AD\u30FC\u30DE\u3068\u4E00\u81F4\u3057\u307E\u305B\u3093: ${u.error.message}`);let p=u.data,l=s.headers.get("ETag")?.replace(/"/g,"")??"";return{bundle:p,etag:l}}async function jk(e,t){let{pbkdf2:r}=await import("node:crypto"),{createDecipheriv:n}=await import("node:crypto"),o=Buffer.from(e.salt,"hex"),i=Buffer.from(e.iv,"hex"),s=Buffer.from(e.tag,"hex"),a=Buffer.from(e.data,"base64"),c=await new Promise((l,d)=>{r(t,o,1e5,32,"sha256",(h,f)=>{h?d(h):l(f)})}),u=n("aes-256-gcm",c,i);u.setAuthTag(s);let p=Buffer.concat([u.update(a),u.final()]);try{return JSON.parse(p.toString("utf-8"))}catch(l){throw new Error(`Registry API \u30D0\u30F3\u30C9\u30EB\u306E\u5FA9\u53F7\u7D50\u679C\u304C\u4E0D\u6B63\u306A JSON \u3067\u3059: ${st(l)}`)}}import{createHash as UM,createCipheriv as BM,createDecipheriv as VM,randomBytes as Mk,pbkdf2 as HM}from"node:crypto";import{existsSync as jc,mkdirSync as GM,readFileSync as Ph,writeFileSync as Dk}from"node:fs";import{homedir as KM}from"node:os";import{join as Po}from"node:path";var WM=600*60*1e3;function Eh(){let e=process.env.HOME??process.env.USERPROFILE??KM(),t=Po(e,".godd","cache");return jc(t)||GM(t,{recursive:!0}),t}function zh(e,t){let r=`${[...e].sort().join(",")}_${t}`;return UM("sha256").update(r).digest("hex").slice(0,16)}function Lk(e,t){return new Promise((r,n)=>{HM(e,t,5e4,32,"sha256",(o,i)=>{o?n(o):r(i)})})}async function JM(e,t){let r=Mk(32),n=await Lk(t,r),o=Mk(12),i=BM("aes-256-gcm",n,o),s=Buffer.concat([i.update(e),i.final()]),a=i.getAuthTag();return Buffer.concat([r,o,a,s])}async function YM(e,t){let r=e.subarray(0,32),n=e.subarray(32,44),o=e.subarray(44,60),i=e.subarray(60),s=await Lk(t,r),a=VM("aes-256-gcm",s,n);return a.setAuthTag(o),Buffer.concat([a.update(i),a.final()])}async function Zk(e,t,r,n,o){let i=Eh(),s=zh(r,n),a=await JM(Buffer.from(e,"utf-8"),o);Dk(Po(i,`bundle-${s}.enc`),a);let c={etag:t,timestamp:Date.now(),components:r,language:n,profileHash:s};Dk(Po(i,"meta.json"),JSON.stringify(c,null,2),"utf-8")}async function qk(e,t,r){let n=Eh(),o=Po(n,"meta.json");if(!jc(o))return null;let i;try{i=JSON.parse(Ph(o,"utf-8"))}catch{return null}let s=zh(e,t);if(i.profileHash!==s)return null;let a=Po(n,`bundle-${s}.enc`);if(!jc(a))return null;try{let c=Ph(a);return{data:(await YM(c,r)).toString("utf-8"),etag:i.etag,isExpired:Date.now()-i.timestamp>WM}}catch{return null}}function Fk(e,t){let r=Eh(),n=Po(r,"meta.json");if(jc(n))try{let o=JSON.parse(Ph(n,"utf-8")),i=zh(e,t);return o.profileHash!==i?void 0:o.etag}catch{return}}function Xi(e){for(let[t,r]of Object.entries(e.partials))Qi(t,r);for(let[t,r]of Object.entries(e.prompts))fr(`prompt:${t}`,r);for(let[t,r]of Object.entries(e.agents))fr(`agent:${t}`,r);for(let[t,r]of Object.entries(e.mindsets))fr(`mindset:${t}`,r)}import{execSync as QM}from"node:child_process";import{existsSync as XM,readFileSync as eD}from"node:fs";import{join as tD}from"node:path";function Ch(e){let t=e??process.cwd();try{let r=QM("git config --get remote.origin.url",{encoding:"utf-8",cwd:t,timeout:5e3}).trim();if(r)return r}catch{}try{let r=tD(t,".git","config");return XM(r)?eD(r,"utf-8").match(/\[remote\s+"origin"\][^[]*url\s*=\s*(.+)/)?.[1]?.trim()??null:null}catch{return null}}var Uk=3600*1e3,Ih=new Map;async function Rh(e,t){let r=Ch();if(!r)throw new Error("Git \u30EA\u30E2\u30FC\u30C8 (origin) \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002godd init \u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002");let n=await fetch(`${e}/v1/repos/register`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({remote_url:r}),signal:AbortSignal.timeout(1e4)});if(!n.ok){let i=(await n.json().catch(()=>({detail:n.statusText}))).detail,s=typeof i=="string"?i:i!=null?JSON.stringify(i):n.statusText;throw new Error(`\u30EA\u30DD\u30B8\u30C8\u30EA\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${s}`)}Ih.set(r,{verified:!0,verifiedAt:Date.now()})}function rD(e){if(e){let t=Ih.get(e);return t?Date.now()-t.verifiedAt<Uk:!1}for(let t of Ih.values())if(Date.now()-t.verifiedAt<Uk)return!0;return!1}async function Bk(e,t){let r=Ch();r&&rD(r)||await Rh(e,t)}import{existsSync as ke,readFileSync as Vk,readdirSync as es,statSync as Ah}from"node:fs";import{join as K,basename as nD}from"node:path";function Eo(e){try{return ke(e)?JSON.parse(Vk(e,"utf-8")):null}catch{return null}}function hr(e,t=4096){try{return ke(e)?Vk(e).subarray(0,t).toString("utf-8"):""}catch{return""}}var oD={"browser-use":{description:"Python AI \u30D6\u30E9\u30A6\u30B6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 \u2014 Web\u30D6\u30E9\u30A6\u30B6\u3092\u81EA\u52D5\u64CD\u4F5C",runtime:"python",setupHint:"uv sync && uv run browser-use install"},"android-use":{description:"Python Android AI \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 \u2014 Android\u7AEF\u672B\u3092ADB\u3067\u81EA\u52D5\u64CD\u4F5C",runtime:"python",setupHint:"python -m venv .venv && pip install -r requirements.txt"},"react-grab":{description:"Node.js React \u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u30B3\u30D4\u30FC\u30C4\u30FC\u30EB \u2014 React\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u30C4\u30EA\u30FC\u3092\u62BD\u51FA",runtime:"node",setupHint:"pnpm install && pnpm build"}};function iD(e){let t=K(e,"vendor");if(!ke(t))return[];let r=[];try{for(let n of es(t)){let o=K(t,n);if(!Ah(o).isDirectory())continue;let i=oD[n];if(i)r.push({name:n,path:o,description:i.description,runtime:i.runtime,setupHint:i.setupHint});else{let s=ke(K(o,"pyproject.toml")),a=ke(K(o,"package.json")),c=s?"python":a?"node":"unknown";r.push({name:n,path:o,description:`vendor/${n}`,runtime:c,setupHint:c==="python"?"uv sync":"pnpm install"})}}}catch{}return r}function sD(e){let t=[],r=K(e,"backend","pyproject.toml"),n=K(e,"backend","requirements.txt");if(ke(r)){let _=hr(r);_.includes("fastapi")&&t.push({id:"fastapi",label:"FastAPI",evidence:"backend/pyproject.toml \u306B fastapi \u3092\u691C\u51FA"}),_.includes("django")&&t.push({id:"django",label:"Django",evidence:"backend/pyproject.toml \u306B django \u3092\u691C\u51FA"})}else ke(n)&&hr(n).includes("fastapi")&&t.push({id:"fastapi",label:"FastAPI",evidence:"backend/requirements.txt \u306B fastapi \u3092\u691C\u51FA"});let o=Eo(K(e,"frontend","package.json")),i=Eo(K(e,"package.json")),s=Eo(K(e,"src","package.json"));for(let[_,v]of[["frontend/package.json",o],["package.json",i],["src/package.json",s]]){if(!v)continue;let y={...v.dependencies,...v.devDependencies};y.react&&t.push({id:"react",label:"React",evidence:`${_} \u306B react \u3092\u691C\u51FA`}),y.next&&t.push({id:"nextjs",label:"Next.js",evidence:`${_} \u306B next \u3092\u691C\u51FA`}),y.vue&&t.push({id:"vue",label:"Vue.js",evidence:`${_} \u306B vue \u3092\u691C\u51FA`}),y.svelte&&t.push({id:"svelte",label:"Svelte",evidence:`${_} \u306B svelte \u3092\u691C\u51FA`}),y.electron&&t.push({id:"electron",label:"Electron",evidence:`${_} \u306B electron \u3092\u691C\u51FA`})}let a=K(e,"pubspec.yaml");if(ke(a)){let _=hr(a);t.push({id:"dart",label:"Dart",evidence:"pubspec.yaml \u3092\u691C\u51FA"}),_.includes("flutter")&&t.push({id:"flutter",label:"Flutter",evidence:"pubspec.yaml \u306B flutter \u3092\u691C\u51FA"})}let c=ke(K(e,"Package.swift")),u=K(e,"ios"),p=ke(u)&&(()=>{try{return es(u).some(_=>_.endsWith(".xcodeproj")||_.endsWith(".xcworkspace"))}catch{return!1}})();(c||p)&&t.push({id:"swift",label:"Swift",evidence:c?"Package.swift \u3092\u691C\u51FA":"ios/*.xcodeproj \u3092\u691C\u51FA"});let l=ke(K(e,"build.gradle.kts")),d=ke(K(e,"build.gradle")),h=K(e,"android"),f=ke(K(h,"build.gradle.kts"))||ke(K(h,"build.gradle"));(l||d||f)&&t.push({id:"kotlin",label:"Kotlin",evidence:l?"build.gradle.kts \u3092\u691C\u51FA":d?"build.gradle \u3092\u691C\u51FA":"android/build.gradle \u3092\u691C\u51FA"});let g=hr(K(e,"docker-compose.yml"));return g&&g.includes("postgres")&&t.push({id:"postgres",label:"Postgres",evidence:"docker-compose.yml \u306B postgres \u3092\u691C\u51FA"}),(ke(K(e,"prisma","schema.prisma"))||ke(K(e,"backend","prisma","schema.prisma")))&&t.push({id:"prisma",label:"Prisma",evidence:"prisma/schema.prisma \u3092\u691C\u51FA"}),t}var aD=[{id:"orval",label:"Orval",category:"frontend",description:"OpenAPI \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u30B3\u30FC\u30C9\u81EA\u52D5\u751F\u6210",url:"https://github.com/orval-labs/orval",npmPackage:"orval",configFiles:["orval.config.ts","orval.config.js","orval.config.cjs"]},{id:"tanstack-query",label:"TanStack Query",category:"frontend",description:"\u975E\u540C\u671F\u30C7\u30FC\u30BF\u30D5\u30A7\u30C3\u30C1\u30F3\u30B0/\u30AD\u30E3\u30C3\u30B7\u30E5\u7BA1\u7406",url:"https://github.com/TanStack/query",npmPackage:"@tanstack/react-query"},{id:"vite",label:"Vite",category:"frontend",description:"\u9AD8\u901F\u30D5\u30ED\u30F3\u30C8\u30A8\u30F3\u30C9\u30D3\u30EB\u30C9\u30C4\u30FC\u30EB",url:"https://vitejs.dev/",npmPackage:"vite",configFiles:["vite.config.ts","vite.config.js","vite.config.mts"]},{id:"biome",label:"Biome",category:"devtool",description:"\u9AD8\u901F Linter / Formatter\uFF08Rust\u88FD\uFF09",url:"https://biomejs.dev/",npmPackage:"@biomejs/biome",configFiles:["biome.json","biome.jsonc"]},{id:"storybook",label:"Storybook",category:"frontend",description:"UI\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u958B\u767A/\u30AB\u30BF\u30ED\u30B0\u30C4\u30FC\u30EB",url:"https://storybook.js.org/",npmPackage:"storybook",configFiles:[".storybook/main.ts",".storybook/main.js"]},{id:"ruff",label:"Ruff",category:"devtool",description:"\u8D85\u9AD8\u901F Python Linter / Formatter\uFF08Rust\u88FD\uFF09",url:"https://docs.astral.sh/ruff/",pyPackage:"ruff",configFiles:["ruff.toml",".ruff.toml"]},{id:"uv",label:"uv",category:"devtool",description:"\u9AD8\u901F Python \u30D1\u30C3\u30B1\u30FC\u30B8\u30DE\u30CD\u30FC\u30B8\u30E3\uFF08Rust\u88FD\uFF09",url:"https://docs.astral.sh/uv/",configFiles:["uv.lock"]},{id:"sqlmodel",label:"SQLModel",category:"backend",description:"SQLAlchemy + Pydantic \u30D9\u30FC\u30B9\u306E Python ORM",url:"https://sqlmodel.tiangolo.com/",pyPackage:"sqlmodel"},{id:"alembic",label:"Alembic",category:"backend",description:"SQLAlchemy \u30D9\u30FC\u30B9\u306E DB \u30DE\u30A4\u30B0\u30EC\u30FC\u30B7\u30E7\u30F3\u30C4\u30FC\u30EB",url:"https://alembic.sqlalchemy.org/",pyPackage:"alembic",configFiles:["alembic.ini","backend/alembic.ini"]},{id:"fastapi-users",label:"FastAPI Users",category:"backend",description:"FastAPI \u5411\u3051\u8A8D\u8A3C/\u30E6\u30FC\u30B6\u30FC\u7BA1\u7406\u30E9\u30A4\u30D6\u30E9\u30EA",url:"https://fastapi-users.github.io/fastapi-users/",pyPackage:"fastapi-users"},{id:"pytest",label:"Pytest",category:"testing",description:"Python \u30C6\u30B9\u30C8\u30D5\u30EC\u30FC\u30E0\u30EF\u30FC\u30AF",url:"https://docs.pytest.org/",pyPackage:"pytest",configFiles:["pytest.ini","pyproject.toml"]},{id:"httpx",label:"HTTPX",category:"testing",description:"Python \u975E\u540C\u671F HTTP \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\uFF08\u30C6\u30B9\u30C8\u7528\uFF09",url:"https://www.python-httpx.org/",pyPackage:"httpx"},{id:"playwright",label:"Playwright",category:"testing",description:"\u30AF\u30ED\u30B9\u30D6\u30E9\u30A6\u30B6 E2E \u30C6\u30B9\u30C8\u30D5\u30EC\u30FC\u30E0\u30EF\u30FC\u30AF",url:"https://playwright.dev/",npmPackage:"@playwright/test",pyPackage:"playwright",configFiles:["playwright.config.ts","playwright.config.js"]},{id:"docker-compose",label:"Docker Compose",category:"infra",description:"\u30DE\u30EB\u30C1\u30B3\u30F3\u30C6\u30CA\u30AA\u30FC\u30B1\u30B9\u30C8\u30EC\u30FC\u30B7\u30E7\u30F3",url:"https://docs.docker.com/compose/",configFiles:["docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml"]},{id:"caddy",label:"Caddy",category:"infra",description:"\u81EA\u52D5 HTTPS \u5BFE\u5FDC\u30EA\u30D0\u30FC\u30B9\u30D7\u30ED\u30AD\u30B7",url:"https://caddyserver.com/",configFiles:["Caddyfile"],dockerPattern:"caddy"},{id:"traefik",label:"Traefik",category:"infra",description:"\u30AF\u30E9\u30A6\u30C9\u30CD\u30A4\u30C6\u30A3\u30D6 \u30EA\u30D0\u30FC\u30B9\u30D7\u30ED\u30AD\u30B7 / \u30ED\u30FC\u30C9\u30D0\u30E9\u30F3\u30B5",url:"https://traefik.io/",configFiles:["traefik.yml","traefik.toml"],dockerPattern:"traefik"},{id:"flutter",label:"Flutter",category:"frontend",description:"\u30AF\u30ED\u30B9\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0 UI \u30D5\u30EC\u30FC\u30E0\u30EF\u30FC\u30AF\uFF08Dart\uFF09",url:"https://flutter.dev/",configFiles:["pubspec.yaml"]},{id:"cocoapods",label:"CocoaPods",category:"devtool",description:"iOS / macOS \u4F9D\u5B58\u7BA1\u7406\u30C4\u30FC\u30EB",url:"https://cocoapods.org/",configFiles:["Podfile","ios/Podfile"]},{id:"gradle",label:"Gradle",category:"devtool",description:"Android / JVM \u30D3\u30EB\u30C9\u30C4\u30FC\u30EB",url:"https://gradle.org/",configFiles:["build.gradle.kts","build.gradle","android/build.gradle.kts","android/build.gradle"]},{id:"swiftpm",label:"Swift Package Manager",category:"devtool",description:"Swift \u30D1\u30C3\u30B1\u30FC\u30B8\u7BA1\u7406\u30FB\u30D3\u30EB\u30C9\u30C4\u30FC\u30EB",url:"https://www.swift.org/package-manager/",configFiles:["Package.swift"]},{id:"sentry",label:"Sentry",category:"monitoring",description:"\u30A8\u30E9\u30FC\u8FFD\u8DE1 / \u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u76E3\u8996",url:"https://sentry.io/",npmPackage:"@sentry/react",pyPackage:"sentry-sdk",configFiles:["sentry.properties"]}];function cD(e){let t={},r=new Map,n=[K(e,"package.json"),K(e,"frontend","package.json"),K(e,"src","package.json")];for(let o of n){let i=Eo(o);if(!i)continue;let s=o.replace(e,"").replace(/^[\\/]/,""),a=i.dependencies,c=i.devDependencies;for(let[u,p]of Object.entries({...a,...c}))t[u]=p,r.set(u,s)}return{deps:t,sources:r}}function uD(e){let t=new Set,r="";for(let n of[K(e,"backend"),e]){let o=K(n,"pyproject.toml");if(ke(o)){let a=hr(o,16384).matchAll(/["']([a-zA-Z][\w.-]*)(?:\[.*?\])?(?:>=|<=|==|~=|!=|<|>)?/g);for(let c of a)t.add(c[1].toLowerCase().replace(/[-_.]+/g,"-"));r=o.replace(e,"").replace(/^[\\/]/,"");break}let i=K(n,"requirements.txt");if(ke(i)){let s=hr(i,16384);for(let a of s.split(`
|
|
98
98
|
`)){let c=a.trim();if(!c||c.startsWith("#"))continue;let u=c.match(/^([a-zA-Z][\w.-]*)/);u&&t.add(u[1].toLowerCase().replace(/[-_.]+/g,"-"))}r=i.replace(e,"").replace(/^[\\/]/,"");break}}return{deps:t,source:r}}function lD(e){let t=[],r=new Set,{deps:n,sources:o}=cD(e),{deps:i,source:s}=uD(e),a="";for(let c of["docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml"]){let u=hr(K(e,c));if(u){a=u;break}}for(let c of aD)if(!r.has(c.id)){if(c.npmPackage&&c.npmPackage in n){let u=o.get(c.npmPackage)??"package.json";r.add(c.id),t.push({id:c.id,label:c.label,category:c.category,description:c.description,evidence:`${u} \u306B ${c.npmPackage} \u3092\u691C\u51FA`,version:n[c.npmPackage],url:c.url});continue}if(c.pyPackage&&i.has(c.pyPackage.toLowerCase().replace(/[-_.]+/g,"-"))){r.add(c.id),t.push({id:c.id,label:c.label,category:c.category,description:c.description,evidence:`${s} \u306B ${c.pyPackage} \u3092\u691C\u51FA`,url:c.url});continue}if(c.configFiles){for(let u of c.configFiles)if(ke(K(e,u))){r.add(c.id),t.push({id:c.id,label:c.label,category:c.category,description:c.description,evidence:`${u} \u3092\u691C\u51FA`,url:c.url});break}if(r.has(c.id))continue}c.dockerPattern&&a.includes(c.dockerPattern)&&(r.add(c.id),t.push({id:c.id,label:c.label,category:c.category,description:c.description,evidence:`docker-compose.yml \u306B ${c.dockerPattern} \u3092\u691C\u51FA`,url:c.url}))}return t}function pD(e){let t;for(let i of["docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml"])if(t=hr(K(e,i)),t)break;if(!t)return[];let r=[],n=/^\s{2}(\w[\w-]*):\s*$/gm,o;for(;(o=n.exec(t))!==null;)r.push(o[1]);return r}function dD(e){let t=K(e,"docs"),r=ke(K(e,"godd-mcp-server","notes-app","package.json")),n=ke(K(e,"godd-mcp-server","notes-api","pyproject.toml"));if(!ke(t))return{exists:!1,sections:[],files:[],has_notes_app:r,has_notes_api:n};let o=[],i=[];function s(a,c){try{for(let u of es(a)){if(u.startsWith("."))continue;let p=K(a,u),l=c?`${c}/${u}`:u;Ah(p).isDirectory()?(c||o.push(u),s(p,l)):i.push(l)}}catch{}}return s(t,""),{exists:!0,sections:o,files:i,has_notes_app:r,has_notes_api:n}}function Hk(e){let t=Eo(K(e,"package.json"))?.name||nD(e),r=[];try{for(let u of es(e)){if(u.startsWith(".")||u==="node_modules")continue;let p=K(e,u);Ah(p).isDirectory()&&r.push(u)}}catch{}let o=["package.json","pyproject.toml","docker-compose.yml","docker-compose.yaml","Dockerfile","tsconfig.json",".env.example","env.example","AGENTS.md","README.md","Makefile",".mise.toml","turbo.json","pnpm-workspace.yaml"].filter(u=>ke(K(e,u))),s=Eo(K(e,"package.json"))?.scripts??{},a=[];try{for(let u of es(e))(u.match(/^env.*\.example$/)||u.match(/^\.env.*\.example$/))&&a.push(u)}catch{}let c=hr(K(e,"README.md"),500);return{root:e,name:t,detected_stacks:sD(e),detected_tools:lD(e),vendor_items:iD(e),key_files:o,directories:r,scripts:s,docker_services:pD(e),env_templates:a,readme_excerpt:c,question_list_path:K(e,"docs","003_requirements","questions.csv"),docs_structure:dD(e)}}function fD(e,t){let r=t??process.env.GODD_PROJECT_ROOT??process.cwd();if(e.projectContext?.root===r)return e.projectContext;let n=Hk(r);return e.projectContext=n,n}function j(e,t,r,n,o){let i=fD(e,n),s=e.config.language??"en",a=Rk(t,e.profile,{project:i,language:s,...o});return`${s!=="en"?`> **Output Language**: Respond entirely in ${s}.
|
|
99
99
|
|
|
@@ -258,7 +258,7 @@ ${i.map(a=>`- ${a}`).join(`
|
|
|
258
258
|
\`\`\`yaml
|
|
259
259
|
${XS(s)}\`\`\`
|
|
260
260
|
|
|
261
|
-
\u26A0 MCP \u30B5\u30FC\u30D0\u30FC\u306E\u518D\u8D77\u52D5\u304C\u5FC5\u8981\u3067\u3059\uFF08Cursor IDE \u3092\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002`}import{verify as _D,createPublicKey as yD}from"node:crypto";var vD=/^godd-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Nh="";function jh(e){Nh=e}function o1(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Buffer.from(t,"base64")}function Mh(e){return vD.test(e.trim())}function xD(e){let t=e.trim();if(Mh(t))throw new at("Registry \u767A\u884C\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F Registry API \u3067\u691C\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044");let r=t.split(".");if(r.length!==2)throw new at("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306E\u5F62\u5F0F\u304C\u4E0D\u6B63\u3067\u3059");let[n,o]=r;if(Nh){let c=yD(Nh),u=o1(o);if(!_D(null,Buffer.from(n),c,u))throw new at("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306E\u7F72\u540D\u304C\u7121\u52B9\u3067\u3059")}else if(process.env.SKIP_LICENSE_VERIFY!=="true")throw new at("\u516C\u958B\u9375\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u304C\u3067\u304D\u307E\u305B\u3093");let i=o1(n).toString("utf-8"),s;try{s=JSON.parse(i)}catch{throw new at("\u30E9\u30A4\u30BB\u30F3\u30B9\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u89E3\u6790\u306B\u5931\u6557\u3057\u307E\u3057\u305F")}if(s.v!==1)throw new at(`\u672A\u5BFE\u5FDC\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30D0\u30FC\u30B8\u30E7\u30F3: ${s.v}`);let a=new Date(s.exp);if(isNaN(a.getTime()))throw new at("\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u304C\u4E0D\u6B63\u3067\u3059");if(a<new Date)throw new at(`\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u3066\u3044\u307E\u3059\uFF08${s.exp}\uFF09`);return s}function Dh(e,t){let r=xD(e);if(r.stack&&r.stack!==t)throw new at(`\u3053\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u306F\u30B9\u30BF\u30C3\u30AF '${r.stack}' \u5C02\u7528\u3067\u3059\uFF08\u8981\u6C42: '${t}'\uFF09`);return r}var at=class extends Error{constructor(t){super(t),this.name="LicenseError"}};import{dirname as i1,join as In}from"node:path";import{fileURLToPath as a1}from"node:url";import{readFileSync as Lh,existsSync as s1}from"node:fs";var mr;try{mr=i1(a1(import.meta.url))}catch{mr=i1(process.execPath)}function bD(){try{let e=In(mr,"..","package.json");return JSON.parse(Lh(e,"utf-8")).version??"0.0.0"}catch{return"0.0.0"}}async function kD(e){let t=e.components??[];if(t.length===0)return null;let r=await qk(t,e.language,e.license_key);if(r&&!r.isExpired){console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F");try{let n=JSON.parse(r.data);return Xi(n),n}catch{console.error("[GoDD] \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002Registry API \u304B\u3089\u518D\u30D5\u30A7\u30C3\u30C1\u3057\u307E\u3059")}}try{let n=Fk(t,e.language),o=await Nk(e,n);if(o===null&&r){console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306F\u30AD\u30E3\u30C3\u30B7\u30E5\u3068\u540C\u4E00\u3067\u3059\uFF08304\uFF09");try{let i=JSON.parse(r.data);return Xi(i),i}catch{console.error("[GoDD] 304 \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F")}}if(o){let i=await jk(o.bundle,e.license_key);Xi(i);let s=JSON.stringify(i);return await Zk(s,o.etag,t,e.language,e.license_key),console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092 Registry API \u304B\u3089\u30D5\u30A7\u30C3\u30C1\u3057\u307E\u3057\u305F"),i}}catch(n){console.error(`[GoDD] Registry API \u3078\u306E\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${st(n)}`)}if(r){console.error("[GoDD] \u8B66\u544A: \u671F\u9650\u5207\u308C\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\uFF08Registry API \u5230\u9054\u4E0D\u80FD\uFF09");try{let n=JSON.parse(r.data);return Xi(n),n}catch{console.error("[GoDD] \u671F\u9650\u5207\u308C\u30AD\u30E3\u30C3\u30B7\u30E5\u306E JSON \u30D1\u30FC\u30B9\u306B\u3082\u5931\u6557\u3057\u307E\u3057\u305F")}}return null}async function wD(){let e=Lx(),t=e.components&&e.components.length>0,r;if(t){try{let d=await Ok(e);d.valid||(console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC: ${d.error??"\u4E0D\u660E\u306A\u30A8\u30E9\u30FC"}`),process.exit(1))}catch(d){console.error(`[GoDD] Registry \u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u5931\u6557\u3002\u30ED\u30FC\u30AB\u30EB\u691C\u8A3C\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: ${st(d)}`),Mh(e.license_key)&&(console.error("[GoDD] Registry \u767A\u884C\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F\u30ED\u30FC\u30AB\u30EB\u7F72\u540D\u691C\u8A3C\u3067\u304D\u307E\u305B\u3093\u3002registry_url \u3068\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u63A5\u7D9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1));let h=In(mr,"..",".keys","public.pem");s1(h)&&jh(Lh(h,"utf-8"));try{let f=e.components?.[0]??e.stack_profile??"fastapi-react";Dh(e.license_key,f)}catch(f){f instanceof at?console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC (\u30ED\u30FC\u30AB\u30EB\u691C\u8A3C): ${f.message}`):console.error(`[GoDD] \u30ED\u30FC\u30AB\u30EB\u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u3067\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC: ${st(f)}`),process.exit(1)}}try{await Rh(e.registry_url,e.license_key)}catch(d){console.error("\u30EA\u30DD\u30B8\u30C8\u30EA\u691C\u8A3C\u30A8\u30E9\u30FC:",st(d)),console.error(" godd init \u3092\u518D\u5B9F\u884C\u3059\u308B\u304B\u3001Registry API \u304C\u8D77\u52D5\u3057\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1)}let l=await kD(e);if(l)r={name:`registry:${e.components.join("+")}`,stacks:e.components.map(d=>({id:d,label:d,name:d})),quality_gate:l.quality_gate?{frontend:l.quality_gate.frontend,backend:l.quality_gate.backend,preflight_command:l.quality_gate.preflight??"pnpm preflight",summary:"format/lint/typecheck/build"}:void 0,tools:l.tools?.map(d=>({id:d.id,label:d.label,category:d.category,description:d.description,guidance:d.guidance}))};else{console.error("[GoDD] Registry/\u30AD\u30E3\u30C3\u30B7\u30E5\u5229\u7528\u4E0D\u53EF\u3002\u30ED\u30FC\u30AB\u30EB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF"),$h(In(mr,"..","templates"));let d=e.stack_profile??"fastapi-react";try{r=Af(d,In(mr,"..","stacks"))}catch(h){console.error(`[GoDD] \u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${d}' \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${st(h)}`),console.error("[GoDD] \u6700\u5C0F\u9650\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u8D77\u52D5\u3057\u307E\u3059"),r={name:d,stacks:[]}}}}else{let l=In(mr,"..",".keys","public.pem");s1(l)&&jh(Lh(l,"utf-8"));try{Dh(e.license_key,e.stack_profile??"fastapi-react")}catch(f){f instanceof at&&(console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC: ${f.message}`),process.exit(1)),console.error(`[GoDD] \u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u3067\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC: ${st(f)}`),process.exit(1)}let d=e.stack_profile??"fastapi-react";try{r=Af(d,In(mr,"..","stacks"))}catch(f){console.error(`[GoDD] \u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${d}' \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${st(f)}`),console.error("[GoDD] \u6700\u5C0F\u9650\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u8D77\u52D5\u3057\u307E\u3059"),r={name:d,stacks:[]}}await Ak(e.license_key)||$h(In(mr,"..","templates"))}let n={profile:r,config:e},o=new Ua({name:"godd-mcp-server",version:bD()});async function i(l){return t&&await Bk(e.registry_url,e.license_key),l()}let s=[];function a(l,d,h,f){let g=h.shape;o.tool(l,d,g,async _=>({content:[{type:"text",text:await i(()=>f(n,h.parse(_)))}]})),s.push({name:l,description:d,params:Object.keys(g)})}function c(l,d,h,f){let g=h.shape;o.tool(l,d,g,async _=>({content:[{type:"text",text:await f(h.parse(_))}]})),s.push({name:l,description:d,params:Object.keys(g)})}a(Gk,Kk,Wk,Jk),a(Yk,Qk,Xk,ew),a(tw,rw,nw,ow),a(iw,sw,aw,cw),a(uw,lw,pw,dw),a(fw,hw,mw,gw),a(_w,yw,vw,xw),a(bw,kw,ww,Sw),a(Tw,$w,Pw,Ew),a(zw,Cw,Iw,Rw),a(Aw,Ow,Nw,jw),a(Mw,Dw,Lw,Zw),a(qw,Fw,Uw,Bw),a(Vw,Hw,Gw,Kw),a(Ww,Jw,Yw,Qw),a(Xw,eS,tS,rS),a(nS,oS,iS,sS),a(aS,cS,uS,lS),a(pS,dS,fS,hS),a(mS,gS,_S,yS),a(vS,xS,bS,kS),a(wS,SS,TS,$S),a(PS,ES,zS,CS),a(IS,RS,AS,OS),a(NS,jS,MS,DS),a(LS,ZS,qS,FS),a(US,BS,VS,HS),a(GS,KS,WS,JS),c(e1,t1,r1,n1);let u=r?.tools??[];u.length>0&&o.resource("ecosystem-tool",new Ai("godd://tools/{toolId}",{list:async()=>({resources:u.map(l=>({uri:`godd://tools/${l.id}`,name:l.label,description:l.description,mimeType:"text/plain"}))})}),async(l,{toolId:d})=>{let h=u.find(g=>g.id===String(d));if(!h)return{contents:[{uri:l.href,text:"Tool not found"}]};let f=[`# ${h.label}`,"",`- **\u30AB\u30C6\u30B4\u30EA**: ${h.category}`,`- **\u8AAC\u660E**: ${h.description}`];return h.guidance&&f.push("","## \u5229\u7528\u30AC\u30A4\u30C0\u30F3\u30B9","",h.guidance),"url"in h&&h.url&&f.push("",`- **\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8**: ${h.url}`),{contents:[{uri:l.href,text:f.join(`
|
|
261
|
+
\u26A0 MCP \u30B5\u30FC\u30D0\u30FC\u306E\u518D\u8D77\u52D5\u304C\u5FC5\u8981\u3067\u3059\uFF08Cursor IDE \u3092\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002`}import{verify as _D,createPublicKey as yD}from"node:crypto";var vD=/^godd-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Nh="";function jh(e){Nh=e}function o1(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Buffer.from(t,"base64")}function Mh(e){return vD.test(e.trim())}function xD(e){let t=e.trim();if(Mh(t))throw new at("Registry \u767A\u884C\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F Registry API \u3067\u691C\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044");let r=t.split(".");if(r.length!==2)throw new at("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306E\u5F62\u5F0F\u304C\u4E0D\u6B63\u3067\u3059");let[n,o]=r;if(Nh){let c=yD(Nh),u=o1(o);if(!_D(null,Buffer.from(n),c,u))throw new at("\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306E\u7F72\u540D\u304C\u7121\u52B9\u3067\u3059")}else if(process.env.SKIP_LICENSE_VERIFY!=="true")throw new at("\u516C\u958B\u9375\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u304C\u3067\u304D\u307E\u305B\u3093");let i=o1(n).toString("utf-8"),s;try{s=JSON.parse(i)}catch{throw new at("\u30E9\u30A4\u30BB\u30F3\u30B9\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u89E3\u6790\u306B\u5931\u6557\u3057\u307E\u3057\u305F")}if(s.v!==1)throw new at(`\u672A\u5BFE\u5FDC\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30D0\u30FC\u30B8\u30E7\u30F3: ${s.v}`);let a=new Date(s.exp);if(isNaN(a.getTime()))throw new at("\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u304C\u4E0D\u6B63\u3067\u3059");if(a<new Date)throw new at(`\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u3066\u3044\u307E\u3059\uFF08${s.exp}\uFF09`);return s}function Dh(e,t){let r=xD(e);if(r.stack&&r.stack!==t)throw new at(`\u3053\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u306F\u30B9\u30BF\u30C3\u30AF '${r.stack}' \u5C02\u7528\u3067\u3059\uFF08\u8981\u6C42: '${t}'\uFF09`);return r}var at=class extends Error{constructor(t){super(t),this.name="LicenseError"}};import{dirname as i1,join as In}from"node:path";import{fileURLToPath as a1}from"node:url";import{readFileSync as Lh,existsSync as s1}from"node:fs";var mr;try{mr=i1(a1(import.meta.url))}catch{mr=i1(process.execPath)}function bD(){try{let e=In(mr,"..","package.json");return JSON.parse(Lh(e,"utf-8")).version??"0.0.0"}catch{return"0.0.0"}}async function kD(e){let t=e.components??[];if(t.length===0)return null;let r=await qk(t,e.language,e.license_key);if(r&&!r.isExpired){console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F");try{let n=JSON.parse(r.data);return Xi(n),n}catch{console.error("[GoDD] \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002Registry API \u304B\u3089\u518D\u30D5\u30A7\u30C3\u30C1\u3057\u307E\u3059")}}try{let n=Fk(t,e.language),o=await Nk(e,n);if(o===null&&r){console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306F\u30AD\u30E3\u30C3\u30B7\u30E5\u3068\u540C\u4E00\u3067\u3059\uFF08304\uFF09");try{let i=JSON.parse(r.data);return Xi(i),i}catch{console.error("[GoDD] 304 \u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u306E JSON \u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F")}}if(o){let i=await jk(o.bundle,e.license_key);Xi(i);let s=JSON.stringify(i);return await Zk(s,o.etag,t,e.language,e.license_key),console.error("[GoDD] \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092 Registry API \u304B\u3089\u30D5\u30A7\u30C3\u30C1\u3057\u307E\u3057\u305F"),i}}catch(n){console.error(`[GoDD] Registry API \u3078\u306E\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${st(n)}`)}if(r){console.error("[GoDD] \u8B66\u544A: \u671F\u9650\u5207\u308C\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\uFF08Registry API \u5230\u9054\u4E0D\u80FD\uFF09");try{let n=JSON.parse(r.data);return Xi(n),n}catch{console.error("[GoDD] \u671F\u9650\u5207\u308C\u30AD\u30E3\u30C3\u30B7\u30E5\u306E JSON \u30D1\u30FC\u30B9\u306B\u3082\u5931\u6557\u3057\u307E\u3057\u305F")}}return null}async function wD(){let e=Lx(),t=e.components&&e.components.length>0,r;if(t){try{let d=await Ok(e);d.valid||(console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC: ${d.error??"\u4E0D\u660E\u306A\u30A8\u30E9\u30FC"}`),process.exit(1))}catch(d){console.error(`[GoDD] Registry \u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u5931\u6557\u3002\u30ED\u30FC\u30AB\u30EB\u691C\u8A3C\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: ${st(d)}`),Mh(e.license_key)&&(console.error("[GoDD] Registry \u767A\u884C\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u306F\u30ED\u30FC\u30AB\u30EB\u7F72\u540D\u691C\u8A3C\u3067\u304D\u307E\u305B\u3093\u3002registry_url \u3068\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u63A5\u7D9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1));let h=In(mr,"..",".keys","public.pem");s1(h)&&jh(Lh(h,"utf-8"));try{let f=e.components?.[0]??e.stack_profile??"fastapi-react";Dh(e.license_key,f)}catch(f){f instanceof at?console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC (\u30ED\u30FC\u30AB\u30EB\u691C\u8A3C): ${f.message}`):console.error(`[GoDD] \u30ED\u30FC\u30AB\u30EB\u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u3067\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC: ${st(f)}`),process.exit(1)}}try{await Rh(e.registry_url,e.license_key)}catch(d){console.error("\u30EA\u30DD\u30B8\u30C8\u30EA\u691C\u8A3C\u30A8\u30E9\u30FC:",st(d)),console.error(" godd init \u3092\u518D\u5B9F\u884C\u3059\u308B\u304B\u3001Registry API \u304C\u8D77\u52D5\u3057\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),process.exit(1)}let l=await kD(e);if(l)r={name:`registry:${e.components.join("+")}`,stacks:e.components.map(d=>({id:d,label:d,name:d})),quality_gate:l.quality_gate?{frontend:l.quality_gate.frontend,backend:l.quality_gate.backend,preflight_command:l.quality_gate.preflight??"pnpm preflight",summary:"format/lint/typecheck/build"}:void 0,tools:l.tools?.map(d=>({id:d.id,label:d.label,category:d.category,description:d.description,guidance:d.guidance}))};else{console.error("[GoDD] Registry/\u30AD\u30E3\u30C3\u30B7\u30E5\u5229\u7528\u4E0D\u53EF\u3002\u30ED\u30FC\u30AB\u30EB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF"),$h(In(mr,"..","templates"));let d=e.stack_profile??"fastapi-react";try{r=Af(d,In(mr,"..","stacks"))}catch(h){console.error(`[GoDD] \u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${d}' \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${st(h)}`),console.error("[GoDD] \u6700\u5C0F\u9650\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u8D77\u52D5\u3057\u307E\u3059"),r={name:d,stacks:[]}}}}else{let l=In(mr,"..",".keys","public.pem");s1(l)&&jh(Lh(l,"utf-8"));try{Dh(e.license_key,e.stack_profile??"fastapi-react")}catch(f){f instanceof at&&(console.error(`\u30E9\u30A4\u30BB\u30F3\u30B9\u30A8\u30E9\u30FC: ${f.message}`),process.exit(1)),console.error(`[GoDD] \u30E9\u30A4\u30BB\u30F3\u30B9\u691C\u8A3C\u3067\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC: ${st(f)}`),process.exit(1)}let d=e.stack_profile??"fastapi-react";try{r=Af(d,In(mr,"..","stacks"))}catch(f){console.error(`[GoDD] \u30B9\u30BF\u30C3\u30AF\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB '${d}' \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${st(f)}`),console.error("[GoDD] \u6700\u5C0F\u9650\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067\u8D77\u52D5\u3057\u307E\u3059"),r={name:d,stacks:[]}}await Ak(e.license_key)||$h(In(mr,"..","templates"))}let n={profile:r,config:e},o=new Ua({name:"godd-mcp-server",version:bD()});async function i(l){return t&&await Bk(e.registry_url,e.license_key),l()}let s=[];function a(l,d,h,f){let g=h.shape;o.tool(l,d,g,async _=>({content:[{type:"text",text:await i(()=>f(n,h.parse(_)))}]})),s.push({name:l,description:d,params:Object.keys(g)})}function c(l,d,h,f){let g=h.shape;o.tool(l,d,g,async _=>({content:[{type:"text",text:await f(h.parse(_))}]})),s.push({name:l,description:d,params:Object.keys(g)})}a(Gk,Kk,Wk,Jk),a(Yk,Qk,Xk,ew),a(tw,rw,nw,ow),a(iw,sw,aw,cw),a(uw,lw,pw,dw),a(fw,hw,mw,gw),a(_w,yw,vw,xw),a(bw,kw,ww,Sw),a(Tw,$w,Pw,Ew),a(zw,Cw,Iw,Rw),a(Aw,Ow,Nw,jw),a(Mw,Dw,Lw,Zw),a(qw,Fw,Uw,Bw),a(Vw,Hw,Gw,Kw),a(Ww,Jw,Yw,Qw),a(Xw,eS,tS,rS),a(nS,oS,iS,sS),a(aS,cS,uS,lS),a(pS,dS,fS,hS),a(mS,gS,_S,yS),a(vS,xS,bS,kS),a(wS,SS,TS,$S),a(PS,ES,zS,CS),a(IS,RS,AS,OS),a(NS,jS,MS,DS),a(LS,ZS,qS,FS),a(US,BS,VS,HS),a(GS,KS,WS,JS),c(e1,t1,r1,n1);for(let l of s)o.prompt(l.name,l.description,()=>({messages:[{role:"user",content:{type:"text",text:`\`${l.name}\` \u30C4\u30FC\u30EB\u3092\u4ECA\u3059\u3050\u547C\u3073\u51FA\u3057\u3066\u304F\u3060\u3055\u3044\u3002`}}]}));let u=r?.tools??[];u.length>0&&o.resource("ecosystem-tool",new Ai("godd://tools/{toolId}",{list:async()=>({resources:u.map(l=>({uri:`godd://tools/${l.id}`,name:l.label,description:l.description,mimeType:"text/plain"}))})}),async(l,{toolId:d})=>{let h=u.find(g=>g.id===String(d));if(!h)return{contents:[{uri:l.href,text:"Tool not found"}]};let f=[`# ${h.label}`,"",`- **\u30AB\u30C6\u30B4\u30EA**: ${h.category}`,`- **\u8AAC\u660E**: ${h.description}`];return h.guidance&&f.push("","## \u5229\u7528\u30AC\u30A4\u30C0\u30F3\u30B9","",h.guidance),"url"in h&&h.url&&f.push("",`- **\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8**: ${h.url}`),{contents:[{uri:l.href,text:f.join(`
|
|
262
262
|
`),mimeType:"text/plain"}]}}),o.resource("mcp-tool",new Ai("godd://mcp-tools/{toolName}",{list:async()=>({resources:s.map(l=>({uri:`godd://mcp-tools/${l.name}`,name:l.name,description:l.description,mimeType:"text/plain"}))})}),async(l,{toolName:d})=>{let h=s.find(g=>g.name===String(d));if(!h)return{contents:[{uri:l.href,text:"Tool not found"}]};let f=[`# ${h.name}`,"",h.description,"","## \u30D1\u30E9\u30E1\u30FC\u30BF","",...h.params.map(g=>`- \`${g}\``)];return{contents:[{uri:l.href,text:f.join(`
|
|
263
263
|
`),mimeType:"text/plain"}]}});let p=new Va;await o.connect(p)}var SD=(()=>{try{let e=a1(import.meta.url);return process.argv[1]===e}catch{return!process.env.__GODD_CLI__}})();SD&&wD().catch(e=>{console.error("GoDD MCP Server \u8D77\u52D5\u30A8\u30E9\u30FC:",e),process.exit(1)});export{wD as startServer};
|
|
264
264
|
/*! Bundled license information:
|
|
@@ -12,6 +12,7 @@ from sqlalchemy.exc import IntegrityError
|
|
|
12
12
|
|
|
13
13
|
from app.models import NotesEditingSession, NotesUser
|
|
14
14
|
from app.services.business_date import get_business_date
|
|
15
|
+
from app.services.github import fetch_file_content_safe
|
|
15
16
|
from app.services.github_pr import (
|
|
16
17
|
batch_move_files,
|
|
17
18
|
close_pr,
|
|
@@ -268,11 +269,39 @@ async def rename_on_working_branch(
|
|
|
268
269
|
delete_sha = branch_old_sha if branch_old_sha else old_sha
|
|
269
270
|
await delete_file(branch_name, old_path, delete_sha, message, config)
|
|
270
271
|
|
|
271
|
-
|
|
272
|
+
commit_count_delta = 2
|
|
272
273
|
changed = session.changed_files or []
|
|
273
274
|
for p in (new_path, old_path):
|
|
274
275
|
if p not in changed:
|
|
275
276
|
changed = [*changed, p]
|
|
277
|
+
|
|
278
|
+
styles_old_path = old_path + ".styles.json"
|
|
279
|
+
styles_new_path = new_path + ".styles.json"
|
|
280
|
+
styles_data = await fetch_file_content_safe(styles_old_path, config, ref=branch_name)
|
|
281
|
+
if styles_data is not None:
|
|
282
|
+
styles_new_sha = await get_file_sha(styles_new_path, branch_name, config)
|
|
283
|
+
await commit_file(
|
|
284
|
+
branch_name,
|
|
285
|
+
styles_new_path,
|
|
286
|
+
styles_data["content"],
|
|
287
|
+
message,
|
|
288
|
+
styles_new_sha,
|
|
289
|
+
config,
|
|
290
|
+
)
|
|
291
|
+
styles_branch_old_sha = await get_file_sha(styles_old_path, branch_name, config)
|
|
292
|
+
await delete_file(
|
|
293
|
+
branch_name,
|
|
294
|
+
styles_old_path,
|
|
295
|
+
styles_branch_old_sha or styles_data["sha"],
|
|
296
|
+
message,
|
|
297
|
+
config,
|
|
298
|
+
)
|
|
299
|
+
commit_count_delta += 2
|
|
300
|
+
for p in (styles_new_path, styles_old_path):
|
|
301
|
+
if p not in changed:
|
|
302
|
+
changed = [*changed, p]
|
|
303
|
+
|
|
304
|
+
session.commit_count = (session.commit_count or 0) + commit_count_delta
|
|
276
305
|
session.changed_files = changed
|
|
277
306
|
|
|
278
307
|
try:
|
|
@@ -295,6 +324,7 @@ async def rename_on_working_branch(
|
|
|
295
324
|
"commitCount": session.commit_count,
|
|
296
325
|
"oldPath": old_path,
|
|
297
326
|
"newPath": new_path,
|
|
327
|
+
"stylesMoved": styles_data is not None,
|
|
298
328
|
}
|
|
299
329
|
|
|
300
330
|
|
|
@@ -660,6 +660,10 @@ class TestRenameOnWorkingBranch:
|
|
|
660
660
|
"app.services.pr_chain.get_file_sha",
|
|
661
661
|
new_callable=AsyncMock, return_value=None,
|
|
662
662
|
),
|
|
663
|
+
patch(
|
|
664
|
+
"app.services.pr_chain.fetch_file_content_safe",
|
|
665
|
+
new_callable=AsyncMock, return_value=None,
|
|
666
|
+
),
|
|
663
667
|
patch(
|
|
664
668
|
"app.services.pr_chain.commit_file",
|
|
665
669
|
new_callable=AsyncMock, return_value={"sha": "new-sha"},
|
|
@@ -729,6 +733,10 @@ class TestRenameOnWorkingBranch:
|
|
|
729
733
|
"app.services.pr_chain.get_file_sha",
|
|
730
734
|
new_callable=AsyncMock, return_value=None,
|
|
731
735
|
),
|
|
736
|
+
patch(
|
|
737
|
+
"app.services.pr_chain.fetch_file_content_safe",
|
|
738
|
+
new_callable=AsyncMock, return_value=None,
|
|
739
|
+
),
|
|
732
740
|
patch(
|
|
733
741
|
"app.services.pr_chain.commit_file",
|
|
734
742
|
new_callable=AsyncMock, return_value={"sha": "new-sha"},
|
|
@@ -747,3 +755,83 @@ class TestRenameOnWorkingBranch:
|
|
|
747
755
|
mock_create_branch.assert_called_once_with(
|
|
748
756
|
"docs/editor/2026-04-17", "sha-main", FAKE_CONFIG,
|
|
749
757
|
)
|
|
758
|
+
|
|
759
|
+
@pytest.mark.asyncio
|
|
760
|
+
async def test_rename_moves_styles_sidecar_when_present(self):
|
|
761
|
+
"""A corresponding .styles.json is moved with the file when it exists."""
|
|
762
|
+
user_id = uuid.UUID("00000000-0000-4000-8000-000000000003")
|
|
763
|
+
|
|
764
|
+
mock_session = MagicMock()
|
|
765
|
+
mock_session.user_id = user_id
|
|
766
|
+
mock_session.branch_name = "docs/admin/2026-04-17"
|
|
767
|
+
mock_session.business_date = "2026-04-17"
|
|
768
|
+
mock_session.status = "active"
|
|
769
|
+
mock_session.commit_count = 0
|
|
770
|
+
mock_session.changed_files = []
|
|
771
|
+
|
|
772
|
+
session_result = MagicMock()
|
|
773
|
+
session_result.scalar_one_or_none.return_value = mock_session
|
|
774
|
+
|
|
775
|
+
db = AsyncMock()
|
|
776
|
+
db.execute = AsyncMock(return_value=session_result)
|
|
777
|
+
db.flush = AsyncMock()
|
|
778
|
+
|
|
779
|
+
user_info = {"id": str(user_id), "username": "admin", "displayName": "Admin"}
|
|
780
|
+
sha_by_path = {
|
|
781
|
+
"docs/old.md.styles.json": "styles-old-sha",
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
async def fake_get_file_sha(path: str, _branch: str, _config: dict) -> str | None:
|
|
785
|
+
return sha_by_path.get(path)
|
|
786
|
+
|
|
787
|
+
with (
|
|
788
|
+
patch(
|
|
789
|
+
"app.services.pr_chain.get_business_date",
|
|
790
|
+
new_callable=AsyncMock, return_value="2026-04-17",
|
|
791
|
+
),
|
|
792
|
+
patch(
|
|
793
|
+
"app.services.pr_chain.get_branch_sha",
|
|
794
|
+
new_callable=AsyncMock, return_value="sha-branch",
|
|
795
|
+
),
|
|
796
|
+
patch(
|
|
797
|
+
"app.services.pr_chain.get_file_sha",
|
|
798
|
+
new_callable=AsyncMock, side_effect=fake_get_file_sha,
|
|
799
|
+
),
|
|
800
|
+
patch(
|
|
801
|
+
"app.services.pr_chain.fetch_file_content_safe",
|
|
802
|
+
new_callable=AsyncMock,
|
|
803
|
+
return_value={
|
|
804
|
+
"path": "docs/old.md.styles.json",
|
|
805
|
+
"content": '{"format":"tiptap"}',
|
|
806
|
+
"sha": "styles-old-sha",
|
|
807
|
+
},
|
|
808
|
+
) as mock_fetch_styles,
|
|
809
|
+
patch(
|
|
810
|
+
"app.services.pr_chain.commit_file",
|
|
811
|
+
new_callable=AsyncMock, return_value={"sha": "new-sha"},
|
|
812
|
+
) as mock_commit,
|
|
813
|
+
patch(
|
|
814
|
+
"app.services.pr_chain.delete_file",
|
|
815
|
+
new_callable=AsyncMock,
|
|
816
|
+
) as mock_delete,
|
|
817
|
+
patch("app.services.audit.audit_log", new_callable=AsyncMock),
|
|
818
|
+
):
|
|
819
|
+
result = await rename_on_working_branch(
|
|
820
|
+
db, "docs/old.md", "docs/new.md", "# Content",
|
|
821
|
+
"sha-old", "docs: rename old → new", user_info, FAKE_CONFIG,
|
|
822
|
+
)
|
|
823
|
+
|
|
824
|
+
mock_fetch_styles.assert_awaited_once_with(
|
|
825
|
+
"docs/old.md.styles.json",
|
|
826
|
+
FAKE_CONFIG,
|
|
827
|
+
ref="docs/admin/2026-04-17",
|
|
828
|
+
)
|
|
829
|
+
committed_paths = [call.args[1] for call in mock_commit.await_args_list]
|
|
830
|
+
deleted_paths = [call.args[1] for call in mock_delete.await_args_list]
|
|
831
|
+
|
|
832
|
+
assert "docs/new.md.styles.json" in committed_paths
|
|
833
|
+
assert "docs/old.md.styles.json" in deleted_paths
|
|
834
|
+
assert "docs/new.md.styles.json" in mock_session.changed_files
|
|
835
|
+
assert "docs/old.md.styles.json" in mock_session.changed_files
|
|
836
|
+
assert mock_session.commit_count == 4
|
|
837
|
+
assert result["stylesMoved"] is True
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import type { FileContent } from "@/types";
|
|
3
|
+
import { hasContentDiff, resolveBranchLabels, resolveOriginalContent } from "./branch-diff";
|
|
4
|
+
|
|
5
|
+
const current: FileContent = {
|
|
6
|
+
path: "docs/test.md",
|
|
7
|
+
sha: "branch-sha",
|
|
8
|
+
content: "branch content",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
describe("resolveBranchLabels", () => {
|
|
12
|
+
it("shows selected proposal branch as active branch", () => {
|
|
13
|
+
expect(resolveBranchLabels("docs/alice/20260509", "docs/alice/20260508")).toEqual({
|
|
14
|
+
activeBranch: "docs/alice/20260509",
|
|
15
|
+
baseBranch: "main",
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("falls back to current working branch, then main", () => {
|
|
20
|
+
expect(resolveBranchLabels(null, "docs/alice/20260509").activeBranch).toBe("docs/alice/20260509");
|
|
21
|
+
expect(resolveBranchLabels(null, null).activeBranch).toBe("main");
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe("resolveOriginalContent", () => {
|
|
26
|
+
it("uses base branch content when available", () => {
|
|
27
|
+
const base: FileContent = { path: "docs/test.md", sha: "main-sha", content: "main content" };
|
|
28
|
+
|
|
29
|
+
expect(resolveOriginalContent(base, current)).toBe("main content");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("falls back to current content when base content is unavailable", () => {
|
|
33
|
+
expect(resolveOriginalContent(null, current)).toBe("branch content");
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe("hasContentDiff", () => {
|
|
38
|
+
it("detects branch content that differs from base content", () => {
|
|
39
|
+
expect(hasContentDiff("main content", "branch content")).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("does not report a diff for identical content", () => {
|
|
43
|
+
expect(hasContentDiff("same", "same")).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { FileContent } from "@/types";
|
|
2
|
+
|
|
3
|
+
export const DEFAULT_BASE_REF = "main";
|
|
4
|
+
|
|
5
|
+
export function resolveBranchLabels(
|
|
6
|
+
viewingRef: string | null,
|
|
7
|
+
workingBranch: string | null | undefined,
|
|
8
|
+
baseRef = DEFAULT_BASE_REF,
|
|
9
|
+
) {
|
|
10
|
+
return {
|
|
11
|
+
activeBranch: viewingRef ?? workingBranch ?? baseRef,
|
|
12
|
+
baseBranch: baseRef,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function resolveOriginalContent(
|
|
17
|
+
baseContent: FileContent | null,
|
|
18
|
+
currentContent: FileContent,
|
|
19
|
+
) {
|
|
20
|
+
return baseContent?.content ?? currentContent.content;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function hasContentDiff(original: string, modified: string) {
|
|
24
|
+
return original !== modified;
|
|
25
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { clearDraft, loadDraft, saveDraft } from "./draft-storage";
|
|
3
|
+
|
|
4
|
+
describe("draft-storage", () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
vi.useRealTimers();
|
|
7
|
+
clearDraft();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it("restores a draft only for the same path and branch ref", () => {
|
|
11
|
+
saveDraft("docs/test.md", "proposal/alice", "branch draft");
|
|
12
|
+
|
|
13
|
+
expect(loadDraft("docs/test.md", "proposal/alice")).toBe("branch draft");
|
|
14
|
+
expect(loadDraft("docs/test.md", "main")).toBeNull();
|
|
15
|
+
expect(loadDraft("docs/test.md", "proposal/alice")).toBe("branch draft");
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("keeps independent drafts for different refs on the same path", () => {
|
|
19
|
+
saveDraft("docs/test.md", "main", "main draft");
|
|
20
|
+
saveDraft("docs/test.md", "proposal/alice", "branch draft");
|
|
21
|
+
|
|
22
|
+
expect(loadDraft("docs/test.md", "main")).toBe("main draft");
|
|
23
|
+
expect(loadDraft("docs/test.md", "proposal/alice")).toBe("branch draft");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("does not clear scoped drafts when clearDraft receives only one scope value", () => {
|
|
27
|
+
saveDraft("docs/test.md", "main", "main draft");
|
|
28
|
+
|
|
29
|
+
clearDraft("docs/test.md");
|
|
30
|
+
expect(loadDraft("docs/test.md", "main")).toBe("main draft");
|
|
31
|
+
|
|
32
|
+
clearDraft(undefined, "main");
|
|
33
|
+
expect(loadDraft("docs/test.md", "main")).toBe("main draft");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("treats legacy unscoped drafts as main drafts only", () => {
|
|
37
|
+
localStorage.setItem(
|
|
38
|
+
"notes-draft",
|
|
39
|
+
JSON.stringify({ path: "docs/test.md", content: "legacy draft", ts: Date.now() }),
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
expect(loadDraft("docs/test.md", "main")).toBe("legacy draft");
|
|
43
|
+
expect(loadDraft("docs/test.md", "proposal/alice")).toBeNull();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("expires old drafts", () => {
|
|
47
|
+
vi.setSystemTime(new Date("2026-05-09T00:00:00Z"));
|
|
48
|
+
saveDraft("docs/test.md", "main", "old draft");
|
|
49
|
+
vi.setSystemTime(new Date("2026-05-10T00:00:01Z"));
|
|
50
|
+
|
|
51
|
+
expect(loadDraft("docs/test.md", "main")).toBeNull();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { DEFAULT_BASE_REF } from "./branch-diff";
|
|
2
|
+
|
|
3
|
+
const DRAFT_STORAGE_KEY = "notes-draft";
|
|
4
|
+
const SCOPED_DRAFT_PREFIX = `${DRAFT_STORAGE_KEY}:`;
|
|
5
|
+
const ONE_DAY = 86_400_000;
|
|
6
|
+
|
|
7
|
+
type DraftRecord = {
|
|
8
|
+
path: string;
|
|
9
|
+
ref?: string;
|
|
10
|
+
content: string;
|
|
11
|
+
ts: number;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
function scopedDraftKey(path: string, ref: string) {
|
|
15
|
+
return `${SCOPED_DRAFT_PREFIX}${encodeURIComponent(ref)}:${encodeURIComponent(path)}`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function saveDraft(path: string, ref: string, content: string) {
|
|
19
|
+
try {
|
|
20
|
+
localStorage.setItem(scopedDraftKey(path, ref), JSON.stringify({ path, ref, content, ts: Date.now() }));
|
|
21
|
+
} catch {
|
|
22
|
+
// Quota errors should not block editor input.
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function loadDraft(path: string, ref: string): string | null {
|
|
27
|
+
try {
|
|
28
|
+
const key = scopedDraftKey(path, ref);
|
|
29
|
+
const raw = localStorage.getItem(key);
|
|
30
|
+
if (raw) {
|
|
31
|
+
const data = JSON.parse(raw) as DraftRecord;
|
|
32
|
+
if (Date.now() - data.ts < ONE_DAY) return data.content;
|
|
33
|
+
localStorage.removeItem(key);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (ref !== DEFAULT_BASE_REF) return null;
|
|
38
|
+
const legacyRaw = localStorage.getItem(DRAFT_STORAGE_KEY);
|
|
39
|
+
if (!legacyRaw) return null;
|
|
40
|
+
const data = JSON.parse(legacyRaw) as DraftRecord;
|
|
41
|
+
if (data.path === path && Date.now() - data.ts < ONE_DAY) {
|
|
42
|
+
return data.content;
|
|
43
|
+
}
|
|
44
|
+
localStorage.removeItem(DRAFT_STORAGE_KEY);
|
|
45
|
+
} catch {
|
|
46
|
+
// Corrupt draft data is disposable.
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function clearDraft(path?: string, ref?: string) {
|
|
52
|
+
if (path === undefined && ref === undefined) {
|
|
53
|
+
localStorage.removeItem(DRAFT_STORAGE_KEY);
|
|
54
|
+
for (let i = localStorage.length - 1; i >= 0; i -= 1) {
|
|
55
|
+
const key = localStorage.key(i);
|
|
56
|
+
if (key?.startsWith(SCOPED_DRAFT_PREFIX)) localStorage.removeItem(key);
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (path && ref) {
|
|
62
|
+
localStorage.removeItem(scopedDraftKey(path, ref));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -35,3 +35,42 @@ export function removeEntry(entries: TreeEntry[], targetPath: string): TreeEntry
|
|
|
35
35
|
};
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
+
|
|
39
|
+
export function moveEntry(
|
|
40
|
+
entries: TreeEntry[],
|
|
41
|
+
oldPath: string,
|
|
42
|
+
newParentDir: string,
|
|
43
|
+
): TreeEntry[] {
|
|
44
|
+
if (newParentDir === oldPath || newParentDir.startsWith(oldPath + "/")) {
|
|
45
|
+
return entries;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const entry = findEntry(entries, oldPath);
|
|
49
|
+
const targetParent = findEntry(entries, newParentDir);
|
|
50
|
+
if (!entry || targetParent?.type !== "dir") return entries;
|
|
51
|
+
|
|
52
|
+
const newPath = `${newParentDir}/${entry.name}`;
|
|
53
|
+
const moved = rebaseEntryPath(entry, oldPath, newPath);
|
|
54
|
+
return insertChildEntry(removeEntry(entries, oldPath), newParentDir, moved);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function findEntry(entries: TreeEntry[], targetPath: string): TreeEntry | null {
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (entry.path === targetPath) return entry;
|
|
60
|
+
if (entry.children) {
|
|
61
|
+
const found = findEntry(entry.children, targetPath);
|
|
62
|
+
if (found) return found;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function rebaseEntryPath(entry: TreeEntry, oldPath: string, newPath: string): TreeEntry {
|
|
69
|
+
return {
|
|
70
|
+
...entry,
|
|
71
|
+
path: entry.path === oldPath
|
|
72
|
+
? newPath
|
|
73
|
+
: entry.path.replace(oldPath + "/", newPath + "/"),
|
|
74
|
+
children: entry.children?.map((child) => rebaseEntryPath(child, oldPath, newPath)),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
2
|
import type { TreeEntry } from "@/types";
|
|
3
|
-
import { insertChildEntry, removeEntry } from "@/lib/tree-utils";
|
|
3
|
+
import { insertChildEntry, moveEntry, removeEntry } from "@/lib/tree-utils";
|
|
4
4
|
|
|
5
5
|
const baseTree: TreeEntry[] = [
|
|
6
6
|
{
|
|
@@ -110,3 +110,32 @@ describe("removeEntry", () => {
|
|
|
110
110
|
expect(result).toEqual(baseTree);
|
|
111
111
|
});
|
|
112
112
|
});
|
|
113
|
+
|
|
114
|
+
describe("moveEntry", () => {
|
|
115
|
+
it("moves a file to another folder and updates its path", () => {
|
|
116
|
+
const result = moveEntry(baseTree, "docs/index.md", "docs/project");
|
|
117
|
+
const docsChildren = result[0].children ?? [];
|
|
118
|
+
const project = docsChildren.find((entry) => entry.path === "docs/project");
|
|
119
|
+
|
|
120
|
+
expect(docsChildren.some((entry) => entry.path === "docs/index.md")).toBe(false);
|
|
121
|
+
expect(project?.children?.some((entry) => entry.path === "docs/project/index.md")).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("moves a folder and rebases child paths", () => {
|
|
125
|
+
const tree: TreeEntry[] = [
|
|
126
|
+
...baseTree,
|
|
127
|
+
{ name: "archive", path: "archive", type: "dir", children: [] },
|
|
128
|
+
];
|
|
129
|
+
const result = moveEntry(tree, "docs/project", "archive");
|
|
130
|
+
const archive = result.find((entry) => entry.path === "archive");
|
|
131
|
+
const moved = archive?.children?.find((entry) => entry.path === "archive/project");
|
|
132
|
+
|
|
133
|
+
expect(JSON.stringify(result)).not.toContain("docs/project/readme.md");
|
|
134
|
+
expect(moved?.children?.[0].path).toBe("archive/project/readme.md");
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("does not move into itself", () => {
|
|
138
|
+
const result = moveEntry(baseTree, "docs/project", "docs/project");
|
|
139
|
+
expect(result).toEqual(baseTree);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
@@ -34,8 +34,10 @@ import BranchSelectorModal from "@/components/BranchSelectorModal";
|
|
|
34
34
|
import IssueList from "@/components/IssueList";
|
|
35
35
|
import type { TreeEntry, FileContent, ApiState, FileStyles } from "@/types";
|
|
36
36
|
import { getFileExt } from "@/types";
|
|
37
|
-
import { insertChildEntry, removeEntry } from "@/lib/tree-utils";
|
|
37
|
+
import { insertChildEntry, moveEntry, removeEntry } from "@/lib/tree-utils";
|
|
38
38
|
import { createdFileToContent, createdFileToTreeEntry } from "@/lib/created-file";
|
|
39
|
+
import { DEFAULT_BASE_REF, hasContentDiff, resolveBranchLabels, resolveOriginalContent } from "@/lib/branch-diff";
|
|
40
|
+
import { clearDraft, loadDraft, saveDraft } from "@/lib/draft-storage";
|
|
39
41
|
|
|
40
42
|
const MarkdownEditor = lazy(() => import("@/components/MarkdownEditor"));
|
|
41
43
|
const SpreadsheetEditor = lazy(() => import("@/components/SpreadsheetEditor"));
|
|
@@ -46,28 +48,13 @@ const IssueDetailView = lazy(() => import("@/components/IssueDetailView"));
|
|
|
46
48
|
|
|
47
49
|
type SidebarTab = "files" | "issues";
|
|
48
50
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
function loadDraft(path: string): string | null {
|
|
58
|
-
try {
|
|
59
|
-
const raw = localStorage.getItem(DRAFT_STORAGE_KEY);
|
|
60
|
-
if (!raw) return null;
|
|
61
|
-
const data = JSON.parse(raw) as { path: string; content: string; ts: number };
|
|
62
|
-
const ONE_DAY = 86_400_000;
|
|
63
|
-
if (data.path === path && Date.now() - data.ts < ONE_DAY) return data.content;
|
|
64
|
-
localStorage.removeItem(DRAFT_STORAGE_KEY);
|
|
65
|
-
} catch { /* corrupt — ignore */ }
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function clearDraft() {
|
|
70
|
-
localStorage.removeItem(DRAFT_STORAGE_KEY);
|
|
51
|
+
async function fetchFileContent(path: string, ref: string | null, signal: AbortSignal): Promise<FileContent> {
|
|
52
|
+
const refQ = ref ? `?ref=${encodeURIComponent(ref)}` : "";
|
|
53
|
+
const res = await apiFetch(`/files/${encodePath(path)}${refQ}`, { signal });
|
|
54
|
+
if (!res.ok) throw new Error(`${res.status}`);
|
|
55
|
+
const contentType = res.headers.get("content-type") ?? "";
|
|
56
|
+
if (!contentType.includes("application/json")) throw new Error("non-JSON response");
|
|
57
|
+
return res.json();
|
|
71
58
|
}
|
|
72
59
|
|
|
73
60
|
export default function MainPage() {
|
|
@@ -84,6 +71,8 @@ export default function MainPage() {
|
|
|
84
71
|
() => searchParams.get("file"),
|
|
85
72
|
);
|
|
86
73
|
const [fileContent, setFileContent] = useState<FileContent | null>(null);
|
|
74
|
+
const [baseFileContent, setBaseFileContent] = useState<FileContent | null>(null);
|
|
75
|
+
const [baseFileError, setBaseFileError] = useState<string | null>(null);
|
|
87
76
|
const [fileLoading, setFileLoading] = useState(false);
|
|
88
77
|
const [editing, setEditing] = useState(false);
|
|
89
78
|
const [treeFilter, setTreeFilter] = useState("");
|
|
@@ -105,6 +94,10 @@ export default function MainPage() {
|
|
|
105
94
|
const [branchModalOpen, setBranchModalOpen] = useState(false);
|
|
106
95
|
const [viewingRef, setViewingRef] = useState<string | null>(null);
|
|
107
96
|
const pendingStylesRef = useRef<FileStyles | null>(null);
|
|
97
|
+
const selectedFileRef = useRef(selectedFile);
|
|
98
|
+
const viewingRefRef = useRef(viewingRef);
|
|
99
|
+
selectedFileRef.current = selectedFile;
|
|
100
|
+
viewingRefRef.current = viewingRef;
|
|
108
101
|
|
|
109
102
|
const collabUserStyle = useMemo(() => {
|
|
110
103
|
if (!user) return null;
|
|
@@ -207,6 +200,8 @@ export default function MainPage() {
|
|
|
207
200
|
const doSave = useCallback(
|
|
208
201
|
async (newContent: string, styles?: FileStyles | null): Promise<boolean> => {
|
|
209
202
|
if (!fileContent) return false;
|
|
203
|
+
const savePath = fileContent.path;
|
|
204
|
+
const saveRef = viewingRef;
|
|
210
205
|
|
|
211
206
|
const ext = getFileExt(fileContent.path);
|
|
212
207
|
const isXlsx = ext === "xlsx" || ext === "xls";
|
|
@@ -239,6 +234,9 @@ export default function MainPage() {
|
|
|
239
234
|
viewingRef ?? undefined,
|
|
240
235
|
);
|
|
241
236
|
if (result) {
|
|
237
|
+
if (selectedFileRef.current !== savePath || viewingRefRef.current !== saveRef) {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
242
240
|
setFileContent((prev) =>
|
|
243
241
|
prev ? { ...prev, content: isXlsx ? saveContent : newContent, sha: result.sha, styles: styles ?? prev.styles, encoding: isXlsx ? "base64" : prev?.encoding } : prev,
|
|
244
242
|
);
|
|
@@ -273,10 +271,14 @@ export default function MainPage() {
|
|
|
273
271
|
}, [hasUnsavedChanges]);
|
|
274
272
|
|
|
275
273
|
const handleBranchSelect = useCallback((branch: string | null) => {
|
|
274
|
+
fetchAbortRef.current?.abort();
|
|
276
275
|
setViewingRef(branch);
|
|
277
276
|
setSelectedFile(null);
|
|
278
277
|
setFileContent(null);
|
|
278
|
+
setBaseFileContent(null);
|
|
279
|
+
setBaseFileError(null);
|
|
279
280
|
setEditing(false);
|
|
281
|
+
setShowDiff(false);
|
|
280
282
|
setEditedContent(null);
|
|
281
283
|
autoSave.reset();
|
|
282
284
|
}, [autoSave]);
|
|
@@ -291,37 +293,43 @@ export default function MainPage() {
|
|
|
291
293
|
autoSave.reset();
|
|
292
294
|
pendingStylesRef.current = null;
|
|
293
295
|
setSelectedFile(path);
|
|
296
|
+
setBaseFileContent(null);
|
|
297
|
+
setBaseFileError(null);
|
|
294
298
|
setActiveDir(path.substring(0, path.lastIndexOf("/")) || "docs");
|
|
295
299
|
setSearchParams({ file: path }, { replace: true });
|
|
296
300
|
setFileLoading(true);
|
|
297
301
|
setEditing(false);
|
|
298
302
|
setShowOriginal(false);
|
|
303
|
+
setShowDiff(false);
|
|
299
304
|
setEditedContent(null);
|
|
300
305
|
|
|
301
306
|
fetchAbortRef.current?.abort();
|
|
302
307
|
const controller = new AbortController();
|
|
303
308
|
fetchAbortRef.current = controller;
|
|
304
309
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
const ct = r.headers.get("content-type") ?? "";
|
|
310
|
-
if (!ct.includes("application/json")) throw new Error("non-JSON response");
|
|
311
|
-
return r.json();
|
|
312
|
-
})
|
|
313
|
-
.then((data: FileContent) => {
|
|
310
|
+
fetchFileContent(path, viewingRef, controller.signal)
|
|
311
|
+
.then(async (data) => {
|
|
312
|
+
let baseData: FileContent | null = data;
|
|
313
|
+
let baseError: string | null = null;
|
|
314
314
|
if (viewingRef) {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
showToast("未保存の下書きを復元しました", "info");
|
|
321
|
-
} else {
|
|
322
|
-
setFileContent(data);
|
|
315
|
+
try {
|
|
316
|
+
baseData = await fetchFileContent(path, DEFAULT_BASE_REF, controller.signal);
|
|
317
|
+
} catch (err) {
|
|
318
|
+
baseData = null;
|
|
319
|
+
baseError = getErrorMessage(err, `${DEFAULT_BASE_REF} の取得に失敗しました`);
|
|
323
320
|
}
|
|
324
321
|
}
|
|
322
|
+
if (controller.signal.aborted) return;
|
|
323
|
+
setBaseFileContent(baseData);
|
|
324
|
+
setBaseFileError(baseError);
|
|
325
|
+
const draftRef = resolveBranchLabels(viewingRef, editSession.session?.branchName).activeBranch;
|
|
326
|
+
const draft = loadDraft(path, draftRef);
|
|
327
|
+
if (draft) {
|
|
328
|
+
setFileContent({ ...data, content: draft });
|
|
329
|
+
showToast("未保存の下書きを復元しました", "info");
|
|
330
|
+
} else {
|
|
331
|
+
setFileContent(data);
|
|
332
|
+
}
|
|
325
333
|
})
|
|
326
334
|
.catch((e) => {
|
|
327
335
|
if (isAbortError(e)) return;
|
|
@@ -331,7 +339,7 @@ export default function MainPage() {
|
|
|
331
339
|
.finally(() => {
|
|
332
340
|
if (!controller.signal.aborted) setFileLoading(false);
|
|
333
341
|
});
|
|
334
|
-
}, [autoSave, showToast, setSearchParams, viewingRef]);
|
|
342
|
+
}, [autoSave, editSession.session?.branchName, showToast, setSearchParams, viewingRef]);
|
|
335
343
|
|
|
336
344
|
useEffect(() => {
|
|
337
345
|
if (initialFileLoaded.current) return;
|
|
@@ -349,24 +357,26 @@ export default function MainPage() {
|
|
|
349
357
|
if (ok) {
|
|
350
358
|
pendingStylesRef.current = null;
|
|
351
359
|
autoSave.reset();
|
|
352
|
-
clearDraft();
|
|
360
|
+
if (selectedFile) clearDraft(selectedFile, viewingRef ?? editSession.session?.branchName ?? DEFAULT_BASE_REF);
|
|
353
361
|
setEditing(false);
|
|
354
362
|
setShowOriginal(false);
|
|
363
|
+
setShowDiff(false);
|
|
355
364
|
showToast("保存しました", "success");
|
|
356
365
|
} else {
|
|
357
366
|
showToast("保存に失敗しました", "error");
|
|
358
367
|
}
|
|
359
368
|
},
|
|
360
|
-
[doSave, autoSave, showToast],
|
|
369
|
+
[doSave, autoSave, editSession.session?.branchName, selectedFile, showToast, viewingRef],
|
|
361
370
|
);
|
|
362
371
|
|
|
363
372
|
const handleCancelEdit = useCallback(() => {
|
|
364
373
|
autoSave.reset();
|
|
365
374
|
pendingStylesRef.current = null;
|
|
366
|
-
clearDraft();
|
|
375
|
+
if (selectedFile) clearDraft(selectedFile, viewingRef ?? editSession.session?.branchName ?? DEFAULT_BASE_REF);
|
|
367
376
|
setEditing(false);
|
|
368
377
|
setShowOriginal(false);
|
|
369
|
-
|
|
378
|
+
setShowDiff(false);
|
|
379
|
+
}, [autoSave, editSession.session?.branchName, selectedFile, viewingRef]);
|
|
370
380
|
|
|
371
381
|
|
|
372
382
|
const handleFolderClick = useCallback(
|
|
@@ -410,11 +420,14 @@ export default function MainPage() {
|
|
|
410
420
|
pendingStylesRef.current = null;
|
|
411
421
|
setSelectedIssue(null);
|
|
412
422
|
setSelectedFile(created.path);
|
|
423
|
+
setBaseFileContent(createdFileToContent(created));
|
|
424
|
+
setBaseFileError(null);
|
|
413
425
|
setActiveDir(parentPath);
|
|
414
426
|
setSearchParams({ file: created.path }, { replace: true });
|
|
415
427
|
setFileLoading(false);
|
|
416
428
|
setEditing(false);
|
|
417
429
|
setShowOriginal(false);
|
|
430
|
+
setShowDiff(false);
|
|
418
431
|
setEditedContent(null);
|
|
419
432
|
setFileContent(createdFileToContent(created));
|
|
420
433
|
setTree((prev) => insertChildEntry(prev, parentPath, createdFileToTreeEntry(created)));
|
|
@@ -471,6 +484,8 @@ export default function MainPage() {
|
|
|
471
484
|
if (selectedFile === path || (type === "dir" && selectedFile?.startsWith(path + "/"))) {
|
|
472
485
|
setSelectedFile(null);
|
|
473
486
|
setFileContent(null);
|
|
487
|
+
setBaseFileContent(null);
|
|
488
|
+
setBaseFileError(null);
|
|
474
489
|
setSearchParams({}, { replace: true });
|
|
475
490
|
}
|
|
476
491
|
setTree((prev) => removeEntry(prev, path));
|
|
@@ -547,7 +562,9 @@ export default function MainPage() {
|
|
|
547
562
|
handleFileSelect(newPath);
|
|
548
563
|
}
|
|
549
564
|
}
|
|
550
|
-
|
|
565
|
+
setTree((prev) => moveEntry(prev, oldPath, newParentDir));
|
|
566
|
+
if (treeSyncTimerRef.current) clearTimeout(treeSyncTimerRef.current);
|
|
567
|
+
treeSyncTimerRef.current = setTimeout(() => loadTree(), 1500);
|
|
551
568
|
} catch (e) {
|
|
552
569
|
showToast(`移動に失敗しました: ${getErrorMessage(e)}`, "error");
|
|
553
570
|
}
|
|
@@ -574,17 +591,26 @@ export default function MainPage() {
|
|
|
574
591
|
return filterEntries(tree);
|
|
575
592
|
}, [tree, treeFilter]);
|
|
576
593
|
|
|
594
|
+
const ext = fileContent ? getFileExt(fileContent.path) : "";
|
|
595
|
+
const { activeBranch, baseBranch } = resolveBranchLabels(
|
|
596
|
+
viewingRef,
|
|
597
|
+
editSession.session?.branchName,
|
|
598
|
+
);
|
|
599
|
+
|
|
577
600
|
const trackContentChange = useCallback(
|
|
578
601
|
(content: string, styles?: FileStyles | null) => {
|
|
579
602
|
setEditedContent(content);
|
|
580
603
|
if (styles !== undefined) pendingStylesRef.current = styles;
|
|
581
604
|
autoSave.markChanged(content);
|
|
582
|
-
if (selectedFile) saveDraft(selectedFile, content);
|
|
605
|
+
if (selectedFile) saveDraft(selectedFile, activeBranch, content);
|
|
583
606
|
},
|
|
584
|
-
[autoSave, selectedFile],
|
|
607
|
+
[activeBranch, autoSave, selectedFile],
|
|
585
608
|
);
|
|
586
609
|
|
|
587
|
-
const
|
|
610
|
+
const originalContent = fileContent ? resolveOriginalContent(baseFileContent, fileContent) : "";
|
|
611
|
+
const modifiedContent = fileContent ? (editedContent ?? fileContent.content) : "";
|
|
612
|
+
const contentHasDiff = fileContent && !baseFileError ? hasContentDiff(originalContent, modifiedContent) : false;
|
|
613
|
+
const diffButtonLabel = baseFileError ? "差分確認不可" : contentHasDiff ? "差分あり" : "差分";
|
|
588
614
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
589
615
|
const [sidebarTab, setSidebarTab] = useState<SidebarTab>("files");
|
|
590
616
|
const [selectedIssue, setSelectedIssue] = useState<number | "new" | null>(null);
|
|
@@ -856,6 +882,14 @@ export default function MainPage() {
|
|
|
856
882
|
</span>
|
|
857
883
|
{editing && <CollabStatus connected={collab.connected} users={collab.users} />}
|
|
858
884
|
{editing && <SaveStatusIndicator status={autoSave.status} />}
|
|
885
|
+
{fileContent && editing && (
|
|
886
|
+
<span
|
|
887
|
+
className="px-2 py-1 rounded text-xs bg-gray-700 text-gray-300 font-mono truncate max-w-48"
|
|
888
|
+
title={`作業ブランチ: ${activeBranch}`}
|
|
889
|
+
>
|
|
890
|
+
作業: {activeBranch}
|
|
891
|
+
</span>
|
|
892
|
+
)}
|
|
859
893
|
{fileContent && editing && (
|
|
860
894
|
<button
|
|
861
895
|
type="button"
|
|
@@ -865,9 +899,9 @@ export default function MainPage() {
|
|
|
865
899
|
? "bg-gray-600 text-white"
|
|
866
900
|
: "text-gray-400 hover:text-gray-200 hover:bg-gray-700"
|
|
867
901
|
}`}
|
|
868
|
-
title=
|
|
902
|
+
title={`${baseBranch} のソースを参照`}
|
|
869
903
|
>
|
|
870
|
-
|
|
904
|
+
base: {baseBranch}
|
|
871
905
|
</button>
|
|
872
906
|
)}
|
|
873
907
|
{fileContent && editing && (
|
|
@@ -879,9 +913,9 @@ export default function MainPage() {
|
|
|
879
913
|
? "bg-gray-600 text-white"
|
|
880
914
|
: "text-gray-400 hover:text-gray-200 hover:bg-gray-700"
|
|
881
915
|
}`}
|
|
882
|
-
title=
|
|
916
|
+
title={baseFileError ?? `${baseBranch} と ${activeBranch} の差分プレビュー`}
|
|
883
917
|
>
|
|
884
|
-
|
|
918
|
+
{diffButtonLabel}
|
|
885
919
|
</button>
|
|
886
920
|
)}
|
|
887
921
|
{fileContent && !editing && canEdit && apiState === "ready" && (
|
|
@@ -939,10 +973,17 @@ export default function MainPage() {
|
|
|
939
973
|
|
|
940
974
|
{fileContent && !fileLoading && editing && (
|
|
941
975
|
<Suspense fallback={<ContentSkeleton />}>
|
|
942
|
-
{showDiff ? (
|
|
976
|
+
{showDiff && baseFileError ? (
|
|
977
|
+
<div className="p-3 sm:p-6">
|
|
978
|
+
<InlineError
|
|
979
|
+
message={`差分元の ${baseBranch} を読み込めませんでした: ${baseFileError}`}
|
|
980
|
+
onRetry={() => handleFileSelect(fileContent.path)}
|
|
981
|
+
/>
|
|
982
|
+
</div>
|
|
983
|
+
) : showDiff ? (
|
|
943
984
|
<DiffPreview
|
|
944
|
-
original={
|
|
945
|
-
modified={
|
|
985
|
+
original={originalContent}
|
|
986
|
+
modified={modifiedContent}
|
|
946
987
|
onClose={() => setShowDiff(false)}
|
|
947
988
|
/>
|
|
948
989
|
) : (
|
|
@@ -999,7 +1040,7 @@ export default function MainPage() {
|
|
|
999
1040
|
{showOriginal && fileContent && (
|
|
1000
1041
|
<aside className="absolute inset-0 md:static md:w-96 z-20 border-l border-gray-700 bg-gray-800 flex flex-col shrink-0">
|
|
1001
1042
|
<div className="flex items-center justify-between px-3 py-2 border-b border-gray-700">
|
|
1002
|
-
<h3 className="text-sm font-semibold text-gray-300">
|
|
1043
|
+
<h3 className="text-sm font-semibold text-gray-300">{baseBranch} のソース</h3>
|
|
1003
1044
|
<button
|
|
1004
1045
|
type="button"
|
|
1005
1046
|
onClick={() => setShowOriginal(false)}
|
|
@@ -1010,11 +1051,18 @@ export default function MainPage() {
|
|
|
1010
1051
|
</button>
|
|
1011
1052
|
</div>
|
|
1012
1053
|
<div className="flex-1 overflow-auto p-3">
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1054
|
+
{baseFileError ? (
|
|
1055
|
+
<InlineError
|
|
1056
|
+
message={`${baseBranch} のソースを読み込めませんでした: ${baseFileError}`}
|
|
1057
|
+
onRetry={() => handleFileSelect(fileContent.path)}
|
|
1058
|
+
/>
|
|
1059
|
+
) : (
|
|
1060
|
+
<FileContentView
|
|
1061
|
+
path={fileContent.path}
|
|
1062
|
+
content={originalContent}
|
|
1063
|
+
encoding={baseFileContent?.encoding ?? fileContent.encoding}
|
|
1064
|
+
/>
|
|
1065
|
+
)}
|
|
1018
1066
|
</div>
|
|
1019
1067
|
</aside>
|
|
1020
1068
|
)}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ripla/godd-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "GoDD
|
|
5
|
+
"description": "GoDD MCP Server - AI-powered development workflow tools via Model Context Protocol (slash commands support)",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"godd": "dist/godd.js"
|
|
@@ -85,15 +85,14 @@ jobs:
|
|
|
85
85
|
steps:
|
|
86
86
|
- uses: actions/checkout@v4
|
|
87
87
|
|
|
88
|
-
- uses: pnpm/action-setup@
|
|
88
|
+
- uses: pnpm/action-setup@v6
|
|
89
89
|
with:
|
|
90
|
-
version:
|
|
90
|
+
version: 10.15.0
|
|
91
91
|
|
|
92
|
-
- uses: actions/setup-node@
|
|
92
|
+
- uses: actions/setup-node@v6
|
|
93
93
|
with:
|
|
94
|
-
node-version:
|
|
95
|
-
cache:
|
|
96
|
-
cache-dependency-path: notes-app/pnpm-lock.yaml
|
|
94
|
+
node-version: 22
|
|
95
|
+
package-manager-cache: false
|
|
97
96
|
|
|
98
97
|
- name: Install and build
|
|
99
98
|
working-directory: notes-app
|
|
@@ -51,10 +51,13 @@ docs/
|
|
|
51
51
|
│ └── workflow.md # 開発ワークフロー
|
|
52
52
|
└── 007_guides/ # ガイド集
|
|
53
53
|
├── README.md # フォルダの説明
|
|
54
|
-
├──
|
|
54
|
+
├── godd_notes_getting_started.md # GoDD Notes 使い始め方(初期セットアップ/ログイン/編集/Issue・PR作成)
|
|
55
|
+
├── godd_notes_usage.md # GoDD Notesの利用方法(編集操作リファレンス)
|
|
56
|
+
├── release-procedure.md # canary 自動リリース・production 手動リリースの手順
|
|
57
|
+
├── ci-cd-guide.md # CI/CDパイプライン全体像・主要ワークフロー・手動実行・失敗確認
|
|
55
58
|
├── godd_usage.md # GoDD のコマンド一覧、ツール一覧、利用方法
|
|
56
59
|
├── setup_godd.md # GoDD の始め方
|
|
57
|
-
├── setup_godd_notes.md # GoDD Notes
|
|
60
|
+
├── setup_godd_notes.md # GoDD Notesの構築方法(ローカル構築〜デプロイ)
|
|
58
61
|
├── setup_infra.md # インフラのCI/CDの構築ガイド
|
|
59
62
|
└── setup_local_environment.md # ローカル環境構築ガイド
|
|
60
63
|
```
|
|
@@ -66,6 +69,9 @@ docs/
|
|
|
66
69
|
3. README.md は Mermaid ダイアグラムを含める(適切な場合)
|
|
67
70
|
4. 既に `docs/` が存在する場合は既存構造を尊重し、不足分のみ追加
|
|
68
71
|
5. 各ファイルの先頭にファイルの目的を1行コメントで記載
|
|
72
|
+
6. `007_guides/godd_notes_getting_started.md` は「初期セットアップ・ログイン・ファイル編集・Issue/PR 作成」の 4 ステップをカバーし、GoDD Notes を初めて使うユーザーが迷わず操作できる導線を提供する
|
|
73
|
+
7. `007_guides/release-procedure.md` は「canary 自動リリース(main マージ時)」と「production 手動リリース(Actions 手動実行)」の両フローを説明し、必要な Secrets・確認コマンド・トラブルシューティングを含める
|
|
74
|
+
8. `007_guides/ci-cd-guide.md` は「CI/CD 全体像・主要ワークフロー一覧・手動実行手順・失敗時の確認ポイント」を含め、PR から本番デプロイまでのフローを一覧できる
|
|
69
75
|
|
|
70
76
|
## CSV ヘッダー定義
|
|
71
77
|
|