@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 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-registry.up.railway.app")}).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}
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={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},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)",`# 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: http://localhost:8100): ")||"http://localhost:8100",i=Zs();i||(console.error(`
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-registry.up.railway.app")
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
- `# registry_url: "${registryUrl}"`,
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: http://localhost:8100): "
33369
+ "Registry API URL (default: https://dev.api.godd.ripla-inc.com): "
33353
33370
  );
33354
- const registryUrl = registryUrlInput || "http://localhost:8100";
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-registry.up.railway.app")}).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}
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
- session.commit_count = (session.commit_count or 0) + 2
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
- const DRAFT_STORAGE_KEY = "notes-draft";
50
-
51
- function saveDraft(path: string, content: string) {
52
- try {
53
- localStorage.setItem(DRAFT_STORAGE_KEY, JSON.stringify({ path, content, ts: Date.now() }));
54
- } catch { /* quota exceeded — ignore */ }
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
- const refQ = viewingRef ? `?ref=${encodeURIComponent(viewingRef)}` : "";
306
- apiFetch(`/files/${encodePath(path)}${refQ}`, { signal: controller.signal })
307
- .then((r) => {
308
- if (!r.ok) throw new Error(`${r.status}`);
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
- setFileContent(data);
316
- } else {
317
- const draft = loadDraft(path);
318
- if (draft) {
319
- setFileContent({ ...data, content: draft });
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
- }, [autoSave]);
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
- loadTree();
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 ext = fileContent ? getFileExt(fileContent.path) : "";
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="main のソースを参照"
902
+ title={`${baseBranch} のソースを参照`}
869
903
  >
870
- main
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={fileContent.content}
945
- modified={editedContent ?? fileContent.content}
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">main のソース</h3>
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
- <FileContentView
1014
- path={fileContent.path}
1015
- content={fileContent.content}
1016
- encoding={fileContent.encoding}
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.2-canary.8",
3
+ "version": "1.0.3",
4
4
  "type": "module",
5
- "description": "GoDD (Governance-orchestrated Driven Development) MCP Server - Encrypted prompt distribution via Model Context Protocol",
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@v4
88
+ - uses: pnpm/action-setup@v6
89
89
  with:
90
- version: 9
90
+ version: 10.15.0
91
91
 
92
- - uses: actions/setup-node@v4
92
+ - uses: actions/setup-node@v6
93
93
  with:
94
- node-version: 20
95
- cache: pnpm
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
- ├── godd_notes_usage.md # GoDD Notesの利用方法
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