octocode-mcp 4.1.1 → 4.1.2
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/README.md +25 -0
- package/dist/{authenticationManager-DkiqLPZQ.js → authenticationManager-BrDERSd0.js} +1 -1
- package/dist/{githubAppManager-DlxxI3Sj.js → githubAppManager-DIllRVGO.js} +1 -1
- package/dist/index-DnOJNPC2.js +2 -0
- package/dist/index.js +1 -1
- package/dist/{mcpAuthProtocol-Bu7RsMtl.js → mcpAuthProtocol-CGKBrzJb.js} +1 -1
- package/dist/{oauthManager-D0ifTCkq.js → oauthManager-BvuhrXGx.js} +1 -1
- package/package.json +3 -2
- package/dist/index-BKz6wagi.js +0 -2
package/README.md
CHANGED
|
@@ -144,6 +144,31 @@ For organizations with advanced security, audit logging, and OAuth 2.0 authentic
|
|
|
144
144
|
- **[Enterprise Setup Guide](./docs/AUTHENTICATION.md#-enterprise-features)** - Organization policies, audit logging, and security configuration
|
|
145
145
|
- **[OAuth 2.0 Integration](./docs/AUTHENTICATION.md#-oauth-20-integration)** - How OAuth authentication works for organizations
|
|
146
146
|
|
|
147
|
+
### 🧪 Beta Features (Experimental)
|
|
148
|
+
|
|
149
|
+
Enable experimental features by setting `BETA=1` in your environment:
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"mcpServers": {
|
|
154
|
+
"octocode": {
|
|
155
|
+
"command": "npx",
|
|
156
|
+
"args": ["octocode-mcp"],
|
|
157
|
+
"env": {
|
|
158
|
+
"GITHUB_TOKEN": "ghp_xxxxxxxxxxxx",
|
|
159
|
+
"BETA": "1"
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Current Beta Features:**
|
|
167
|
+
- **🤖 Code Explanation Sampling** - When fetching file contents, automatically generates prompts asking the LLM to explain what the code is doing
|
|
168
|
+
- **📊 Enhanced Context Injection** - Provides additional context through MCP sampling protocol to improve response quality
|
|
169
|
+
|
|
170
|
+
**Note:** Beta features are experimental and may change. Enable only for testing and development.
|
|
171
|
+
|
|
147
172
|
### 📚 Complete Authentication Guides
|
|
148
173
|
- **[30-Second Setup](./docs/AUTHENTICATION_QUICK_REFERENCE.md)** - Quick reference for all authentication methods
|
|
149
174
|
- **[Complete Authentication Guide](./docs/AUTHENTICATION.md)** - Detailed setup for OAuth, GitHub Apps, and enterprise features
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{C as i,i as t,g as a,a as e}from"./index-
|
|
2
|
+
import{C as i,i as t,g as a,a as e}from"./index-DnOJNPC2.js";import"node:process";import"events";import"crypto";import"child_process";import"http";import"https";import"url";import"path";import"fs";import"util";import"stream";import"assert";import"tty";import"os";import"zlib";class n{static instance;initialized=!1;static getInstance(){return this.instance||(this.instance=new n),this.instance}async initialize(){if(!this.initialized)try{await this.initializeAuthProtocols(),await this.initializeEnterpriseFeatures(),await this.initializeTokenManagement(),this.initialized=!0,this.logSuccess("Authentication system initialized successfully")}catch(i){throw this.logError("Authentication initialization failed",i),i}}async initializeAuthProtocols(){const t=i.getConfig(),a=t.oauth&&t.oauth.enabled,e=t.githubApp&&t.githubApp.enabled;if(a||e){const{createMCPAuthProtocol:i}=await import("./mcpAuthProtocol-CGKBrzJb.js");if(await i(),a){const{OAuthManager:i}=await import("./oauthManager-BvuhrXGx.js");i.getInstance().initialize(t.oauth),this.logEvent("oauth_manager_initialized","success",{clientId:t.oauth.clientId,scopes:t.oauth.scopes,redirectUri:t.oauth.redirectUri})}if(e){const{GitHubAppManager:i}=await import("./githubAppManager-DIllRVGO.js");i.getInstance().initialize(t.githubApp),this.logEvent("github_app_initialized","success",{appId:t.githubApp.appId,installationId:t.githubApp.installationId})}}}async initializeEnterpriseFeatures(){if(!t())return;const i=a();if(!i)return;if(i.auditLogging){const{AuditLogger:i}=await import("./security/auditLogger.js");i.initialize()}if(i.organizationId){const{OrganizationManager:i}=await import("./index-DnOJNPC2.js").then(function(i){return i.o});i.initialize()}if(i.rateLimiting){const{RateLimiter:i}=await import("./index-DnOJNPC2.js").then(function(i){return i.b});i.initialize()}const{PolicyManager:e}=await import("./security/policyManager.js");e.initialize()}async initializeTokenManagement(){const i=a(),t=i?{organizationId:i.organizationId,enableAuditLogging:i.auditLogging,enableRateLimiting:i.rateLimiting,enableOrganizationValidation:!!i.organizationId}:void 0,{initialize:e}=await import("./index-DnOJNPC2.js").then(function(i){return i.t});await e(t)}logSuccess(i){this.logEvent("authentication_initialized","success",{message:i})}logError(i,t){this.logEvent("authentication_initialized","failure",{message:i,error:t instanceof Error?t.message:String(t)})}logEvent(i,t,a){try{e()&&import("./security/auditLogger.js").then(({AuditLogger:e})=>{e.logEvent({action:i,outcome:t,source:"auth",details:a})})}catch{}}}export{n as AuthenticationManager};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import t from"crypto";import{C as i}from"./index-
|
|
2
|
+
import t from"crypto";import{C as i}from"./index-DnOJNPC2.js";import"node:process";import"events";import"child_process";import"http";import"https";import"url";import"path";import"fs";import"util";import"stream";import"assert";import"tty";import"os";import"zlib";class e{static instance;config=null;tokenCache=new Map;installationCache=new Map;static getInstance(){return this.instance||(this.instance=new e),this.instance}initialize(t){const e=i.getConfig();if(!e.githubApp?.enabled)throw new Error("GitHub App not configured or disabled");this.config={appId:t?.appId||e.githubApp.appId,privateKey:t?.privateKey||e.githubApp.privateKey,installationId:t?.installationId||e.githubApp.installationId,baseUrl:t?.baseUrl||e.githubApp.baseUrl}}generateJWT(){if(!this.config)throw new Error("GitHub App not initialized");const i=Math.floor(Date.now()/1e3),e={iat:i-60,exp:i+600,iss:this.config.appId},n=`${Buffer.from(JSON.stringify({alg:"RS256",typ:"JWT"})).toString("base64url")}.${Buffer.from(JSON.stringify(e)).toString("base64url")}`;return`${n}.${t.sign("RSA-SHA256",Buffer.from(n),this.config.privateKey).toString("base64url")}`}async getInstallationToken(t){if(!this.config)throw new Error("GitHub App not initialized");const i=t||this.config.installationId;if(!i)throw new Error("Installation ID required");const e=this.tokenCache.get(i);if(e&&e.expiresAt>new Date(Date.now()+6e4))return e;try{const t=this.generateJWT(),e=this.getBaseUrl(),n=await fetch(`${e}/app/installations/${i}/access_tokens`,{method:"POST",headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok){const t=await n.text();throw new Error(`Failed to get installation token: ${n.status} ${n.statusText} - ${t}`)}const s=await n.json(),a={token:s.token,expiresAt:new Date(s.expires_at),permissions:s.permissions||{},repositorySelection:s.repository_selection||"all",repositories:s.repositories||[]};return this.tokenCache.set(i,a),setTimeout(()=>{this.tokenCache.delete(i)},a.expiresAt.getTime()-Date.now()-6e4),await this.logAppEvent("installation_token_retrieved","success",{installationId:i,expiresAt:a.expiresAt.toISOString(),permissions:Object.keys(a.permissions)}),a}catch(t){throw await this.logAppEvent("installation_token_retrieval","failure",{installationId:i,error:t instanceof Error?t.message:String(t)}),t}}async listInstallations(){if(!this.config)throw new Error("GitHub App not initialized");try{const t=this.generateJWT(),i=this.getBaseUrl(),e=await fetch(`${i}/app/installations`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!e.ok){const t=await e.text();throw new Error(`Failed to list installations: ${e.status} ${e.statusText} - ${t}`)}const n=await e.json();return n.forEach(t=>{this.installationCache.set(t.id,t)}),n}catch(t){throw await this.logAppEvent("list_installations","failure",{error:t instanceof Error?t.message:String(t)}),t}}async getInstallation(t){if(!this.config)throw new Error("GitHub App not initialized");const i=this.installationCache.get(t);if(i)return i;try{const i=this.generateJWT(),e=this.getBaseUrl(),n=await fetch(`${e}/app/installations/${t}`,{headers:{Authorization:`Bearer ${i}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok){const t=await n.text();throw new Error(`Failed to get installation: ${n.status} ${n.statusText} - ${t}`)}const s=await n.json();return this.installationCache.set(t,s),s}catch(i){throw await this.logAppEvent("get_installation","failure",{installationId:t,error:i instanceof Error?i.message:String(i)}),i}}async validateInstallationPermissions(t,i){try{const e=await this.getInstallationToken(t);for(const t of i){const i=e.permissions[t];if(!i||"none"===i)return!1}return!0}catch(e){return await this.logAppEvent("permission_validation","failure",{installationId:t,requiredPermissions:i,error:e instanceof Error?e.message:String(e)}),!1}}async validateRepositoryAccess(t,i,e){try{const n=await this.getInstallationToken(t);if("all"===n.repositorySelection)return!0;if(n.repositories)return n.repositories.some(t=>t.owner.login===i&&t.name===e);const s=this.getBaseUrl(),a=await fetch(`${s}/installation/repositories`,{headers:{Authorization:`token ${n.token}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});return!!a.ok&&(await a.json()).repositories.some(t=>t.owner.login===i&&t.name===e)}catch(n){return await this.logAppEvent("repository_access_validation","failure",{installationId:t,owner:i,repo:e,error:n instanceof Error?n.message:String(n)}),!1}}async getInstallationUser(t){const i=await this.getInstallationToken(t),e=this.getBaseUrl(),n=await fetch(`${e}/user`,{headers:{Authorization:`token ${i.token}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!n.ok)throw new Error(`Failed to get installation user: ${n.status} ${n.statusText}`);return await n.json()}async getAppInfo(){if(!this.config)throw new Error("GitHub App not initialized");try{const t=this.generateJWT(),i=this.getBaseUrl(),e=await fetch(`${i}/app`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":this.getUserAgent()}});if(!e.ok){const t=await e.text();throw new Error(`Failed to get app info: ${e.status} ${e.statusText} - ${t}`)}return await e.json()}catch(t){throw await this.logAppEvent("get_app_info","failure",{error:t instanceof Error?t.message:String(t)}),t}}clearTokenCache(){this.tokenCache.clear()}clearInstallationCache(){this.installationCache.clear()}getConfig(){return this.config?{appId:this.config.appId,installationId:this.config.installationId,baseUrl:this.config.baseUrl}:null}getBaseUrl(){return this.config?.baseUrl||"https://api.github.com"}getUserAgent(){return`octocode-mcp/${i.getConfig().version} (GitHub App)`}async logAppEvent(t,e,n){try{const s=i.getConfig();if(s.enterprise?.auditLogging){const{AuditLogger:i}=await import("./security/auditLogger.js");i.logEvent({action:`github_app_${t}`,outcome:e,source:"auth",details:{...n,appId:this.config?.appId}})}}catch{}}}export{e as GitHubAppManager,e as default};
|