@phuetz/code-buddy 0.1.18 → 0.1.19
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/agent/background-tasks.d.ts +49 -0
- package/dist/agent/background-tasks.js +153 -0
- package/dist/agent/background-tasks.js.map +1 -0
- package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
- package/dist/agent/definitions/agent-definition-loader.js +161 -0
- package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
- package/dist/agent/definitions/index.d.ts +1 -0
- package/dist/agent/definitions/index.js +2 -0
- package/dist/agent/definitions/index.js.map +1 -0
- package/dist/agent/extended-thinking.d.ts +64 -0
- package/dist/agent/extended-thinking.js +103 -0
- package/dist/agent/extended-thinking.js.map +1 -0
- package/dist/agent/prompt-suggestions.d.ts +55 -0
- package/dist/agent/prompt-suggestions.js +125 -0
- package/dist/agent/prompt-suggestions.js.map +1 -0
- package/dist/agent/rewind-manager.d.ts +59 -0
- package/dist/agent/rewind-manager.js +124 -0
- package/dist/agent/rewind-manager.js.map +1 -0
- package/dist/agent/teams/agent-team.d.ts +54 -0
- package/dist/agent/teams/agent-team.js +114 -0
- package/dist/agent/teams/agent-team.js.map +1 -0
- package/dist/agent/teams/index.d.ts +1 -0
- package/dist/agent/teams/index.js +2 -0
- package/dist/agent/teams/index.js.map +1 -0
- package/dist/agent/teams/team-v2.d.ts +166 -0
- package/dist/agent/teams/team-v2.js +376 -0
- package/dist/agent/teams/team-v2.js.map +1 -0
- package/dist/channels/imessage/index.d.ts +40 -0
- package/dist/channels/imessage/index.js +69 -0
- package/dist/channels/imessage/index.js.map +1 -0
- package/dist/channels/line/index.d.ts +36 -0
- package/dist/channels/line/index.js +71 -0
- package/dist/channels/line/index.js.map +1 -0
- package/dist/channels/mattermost/index.d.ts +34 -0
- package/dist/channels/mattermost/index.js +56 -0
- package/dist/channels/mattermost/index.js.map +1 -0
- package/dist/channels/nextcloud-talk/index.d.ts +37 -0
- package/dist/channels/nextcloud-talk/index.js +67 -0
- package/dist/channels/nextcloud-talk/index.js.map +1 -0
- package/dist/channels/niche-channels.d.ts +61 -0
- package/dist/channels/niche-channels.js +131 -0
- package/dist/channels/niche-channels.js.map +1 -0
- package/dist/channels/nostr/index.d.ts +30 -0
- package/dist/channels/nostr/index.js +68 -0
- package/dist/channels/nostr/index.js.map +1 -0
- package/dist/channels/twilio-voice/index.d.ts +37 -0
- package/dist/channels/twilio-voice/index.js +76 -0
- package/dist/channels/twilio-voice/index.js.map +1 -0
- package/dist/channels/whatsapp/index.js +0 -1
- package/dist/channels/whatsapp/index.js.map +1 -1
- package/dist/channels/zalo/index.d.ts +28 -0
- package/dist/channels/zalo/index.js +53 -0
- package/dist/channels/zalo/index.js.map +1 -0
- package/dist/cloud/cloud-sessions.d.ts +56 -0
- package/dist/cloud/cloud-sessions.js +187 -0
- package/dist/cloud/cloud-sessions.js.map +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
- package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
- package/dist/codebuddy/tool-definitions/index.js +1 -1
- package/dist/codebuddy/tool-definitions/index.js.map +1 -1
- package/dist/commands/handlers/auth-handler.d.ts +32 -0
- package/dist/commands/handlers/auth-handler.js +137 -0
- package/dist/commands/handlers/auth-handler.js.map +1 -0
- package/dist/commands/handlers/context-handler.d.ts +46 -0
- package/dist/commands/handlers/context-handler.js +102 -0
- package/dist/commands/handlers/context-handler.js.map +1 -0
- package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
- package/dist/commands/handlers/keybindings-handler.js +124 -0
- package/dist/commands/handlers/keybindings-handler.js.map +1 -0
- package/dist/commands/handlers/session-commands.d.ts +17 -0
- package/dist/commands/handlers/session-commands.js +119 -0
- package/dist/commands/handlers/session-commands.js.map +1 -0
- package/dist/commands/slash/builtin-commands.js +1 -1
- package/dist/commands/slash/builtin-commands.js.map +1 -1
- package/dist/config/admin-config.d.ts +54 -0
- package/dist/config/admin-config.js +144 -0
- package/dist/config/admin-config.js.map +1 -0
- package/dist/config/advanced-config.d.ts +118 -0
- package/dist/config/advanced-config.js +364 -0
- package/dist/config/advanced-config.js.map +1 -0
- package/dist/config/managed-policies.d.ts +50 -0
- package/dist/config/managed-policies.js +120 -0
- package/dist/config/managed-policies.js.map +1 -0
- package/dist/config/settings-hierarchy.d.ts +59 -0
- package/dist/config/settings-hierarchy.js +188 -0
- package/dist/config/settings-hierarchy.js.map +1 -0
- package/dist/config/tool-profiles.d.ts +37 -0
- package/dist/config/tool-profiles.js +150 -0
- package/dist/config/tool-profiles.js.map +1 -0
- package/dist/config/user-settings.d.ts +31 -0
- package/dist/config/user-settings.js +66 -0
- package/dist/config/user-settings.js.map +1 -0
- package/dist/context/context-files.d.ts +1 -1
- package/dist/context/context-files.js +2 -2
- package/dist/context/context-files.js.map +1 -1
- package/dist/context/partial-summarizer.d.ts +32 -0
- package/dist/context/partial-summarizer.js +144 -0
- package/dist/context/partial-summarizer.js.map +1 -0
- package/dist/desktop/desktop-app.d.ts +44 -0
- package/dist/desktop/desktop-app.js +136 -0
- package/dist/desktop/desktop-app.js.map +1 -0
- package/dist/git/worktree-sessions.d.ts +24 -0
- package/dist/git/worktree-sessions.js +93 -0
- package/dist/git/worktree-sessions.js.map +1 -0
- package/dist/hooks/advanced-hooks.d.ts +110 -0
- package/dist/hooks/advanced-hooks.js +256 -0
- package/dist/hooks/advanced-hooks.js.map +1 -0
- package/dist/hooks/async-hooks.d.ts +73 -0
- package/dist/hooks/async-hooks.js +213 -0
- package/dist/hooks/async-hooks.js.map +1 -0
- package/dist/hooks/env-persistence.d.ts +58 -0
- package/dist/hooks/env-persistence.js +195 -0
- package/dist/hooks/env-persistence.js.map +1 -0
- package/dist/hooks/hook-events.d.ts +36 -0
- package/dist/hooks/hook-events.js +55 -0
- package/dist/hooks/hook-events.js.map +1 -0
- package/dist/hooks/smart-hooks.d.ts +85 -0
- package/dist/hooks/smart-hooks.js +199 -0
- package/dist/hooks/smart-hooks.js.map +1 -0
- package/dist/ide/jetbrains-plugin.d.ts +55 -0
- package/dist/ide/jetbrains-plugin.js +156 -0
- package/dist/ide/jetbrains-plugin.js.map +1 -0
- package/dist/ide/vscode-extension.d.ts +94 -0
- package/dist/ide/vscode-extension.js +229 -0
- package/dist/ide/vscode-extension.js.map +1 -0
- package/dist/index.js +77 -3
- package/dist/index.js.map +1 -1
- package/dist/input/file-autocomplete.d.ts +42 -0
- package/dist/input/file-autocomplete.js +154 -0
- package/dist/input/file-autocomplete.js.map +1 -0
- package/dist/integrations/chrome-bridge.d.ts +90 -0
- package/dist/integrations/chrome-bridge.js +151 -0
- package/dist/integrations/chrome-bridge.js.map +1 -0
- package/dist/integrations/github-action-runner.d.ts +40 -0
- package/dist/integrations/github-action-runner.js +163 -0
- package/dist/integrations/github-action-runner.js.map +1 -0
- package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
- package/dist/integrations/gitlab-ci-runner.js +104 -0
- package/dist/integrations/gitlab-ci-runner.js.map +1 -0
- package/dist/integrations/pr-session-linker.d.ts +44 -0
- package/dist/integrations/pr-session-linker.js +103 -0
- package/dist/integrations/pr-session-linker.js.map +1 -0
- package/dist/integrations/tailscale.d.ts +36 -0
- package/dist/integrations/tailscale.js +101 -0
- package/dist/integrations/tailscale.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +68 -0
- package/dist/lsp/lsp-client.js +182 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/mcp/connectors.d.ts +28 -0
- package/dist/mcp/connectors.js +148 -0
- package/dist/mcp/connectors.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -4
- package/dist/mcp/index.js +7 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
- package/dist/mcp/mcp-auto-discovery.js +104 -0
- package/dist/mcp/mcp-auto-discovery.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +70 -0
- package/dist/mcp/mcp-server.js +374 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/memory/auto-memory.d.ts +53 -0
- package/dist/memory/auto-memory.js +250 -0
- package/dist/memory/auto-memory.js.map +1 -0
- package/dist/memory/hybrid-search.d.ts +51 -0
- package/dist/memory/hybrid-search.js +199 -0
- package/dist/memory/hybrid-search.js.map +1 -0
- package/dist/memory/memory-flush.d.ts +51 -0
- package/dist/memory/memory-flush.js +102 -0
- package/dist/memory/memory-flush.js.map +1 -0
- package/dist/memory/subagent-memory.d.ts +73 -0
- package/dist/memory/subagent-memory.js +172 -0
- package/dist/memory/subagent-memory.js.map +1 -0
- package/dist/nodes/device-node.d.ts +40 -0
- package/dist/nodes/device-node.js +117 -0
- package/dist/nodes/device-node.js.map +1 -0
- package/dist/output/json-schema-output.d.ts +67 -0
- package/dist/output/json-schema-output.js +273 -0
- package/dist/output/json-schema-output.js.map +1 -0
- package/dist/persistence/session-picker.d.ts +22 -0
- package/dist/persistence/session-picker.js +47 -0
- package/dist/persistence/session-picker.js.map +1 -0
- package/dist/persistence/session-store.d.ts +11 -0
- package/dist/persistence/session-store.js +17 -0
- package/dist/persistence/session-store.js.map +1 -1
- package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
- package/dist/plugins/git-pinned-marketplace.js +152 -0
- package/dist/plugins/git-pinned-marketplace.js.map +1 -0
- package/dist/plugins/plugin-manifest.d.ts +116 -0
- package/dist/plugins/plugin-manifest.js +283 -0
- package/dist/plugins/plugin-manifest.js.map +1 -0
- package/dist/sandbox/os-sandbox.d.ts +49 -1
- package/dist/sandbox/os-sandbox.js +347 -6
- package/dist/sandbox/os-sandbox.js.map +1 -1
- package/dist/sdk/agent-sdk.d.ts +61 -0
- package/dist/sdk/agent-sdk.js +90 -0
- package/dist/sdk/agent-sdk.js.map +1 -0
- package/dist/security/permission-modes.d.ts +76 -0
- package/dist/security/permission-modes.js +195 -0
- package/dist/security/permission-modes.js.map +1 -0
- package/dist/security/permission-patterns.d.ts +61 -0
- package/dist/security/permission-patterns.js +171 -0
- package/dist/security/permission-patterns.js.map +1 -0
- package/dist/security/safe-binaries.d.ts +23 -0
- package/dist/security/safe-binaries.js +96 -0
- package/dist/security/safe-binaries.js.map +1 -0
- package/dist/security/sender-policies.d.ts +46 -0
- package/dist/security/sender-policies.js +90 -0
- package/dist/security/sender-policies.js.map +1 -0
- package/dist/server/dashboard.d.ts +53 -0
- package/dist/server/dashboard.js +93 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/services/system-prompt-override.d.ts +34 -0
- package/dist/services/system-prompt-override.js +64 -0
- package/dist/services/system-prompt-override.js.map +1 -0
- package/dist/skills/skill-enhancements.d.ts +37 -0
- package/dist/skills/skill-enhancements.js +69 -0
- package/dist/skills/skill-enhancements.js.map +1 -0
- package/dist/telemetry/otel-tracer.d.ts +98 -0
- package/dist/telemetry/otel-tracer.js +245 -0
- package/dist/telemetry/otel-tracer.js.map +1 -0
- package/dist/tools/browser-stub.d.ts +61 -0
- package/dist/tools/browser-stub.js +184 -0
- package/dist/tools/browser-stub.js.map +1 -0
- package/dist/tools/gateway-tool.d.ts +43 -0
- package/dist/tools/gateway-tool.js +92 -0
- package/dist/tools/gateway-tool.js.map +1 -0
- package/dist/tools/image-stub.d.ts +32 -0
- package/dist/tools/image-stub.js +97 -0
- package/dist/tools/image-stub.js.map +1 -0
- package/dist/tools/js-repl.d.ts +78 -0
- package/dist/tools/js-repl.js +280 -0
- package/dist/tools/js-repl.js.map +1 -0
- package/dist/tools/message-tool.d.ts +42 -0
- package/dist/tools/message-tool.js +113 -0
- package/dist/tools/message-tool.js.map +1 -0
- package/dist/ui/cli-enhancements.d.ts +178 -0
- package/dist/ui/cli-enhancements.js +430 -0
- package/dist/ui/cli-enhancements.js.map +1 -0
- package/dist/ui/status-line.d.ts +90 -0
- package/dist/ui/status-line.js +160 -0
- package/dist/ui/status-line.js.map +1 -0
- package/dist/ui/terminal-enhancements.d.ts +34 -0
- package/dist/ui/terminal-enhancements.js +97 -0
- package/dist/ui/terminal-enhancements.js.map +1 -0
- package/dist/ui/ui-enhancements.d.ts +38 -0
- package/dist/ui/ui-enhancements.js +116 -0
- package/dist/ui/ui-enhancements.js.map +1 -0
- package/dist/utils/custom-instructions.js +4 -1
- package/dist/utils/custom-instructions.js.map +1 -1
- package/dist/utils/init-project.d.ts +1 -1
- package/dist/utils/init-project.js +20 -20
- package/dist/utils/init-project.js.map +1 -1
- package/dist/utils/output-schema-validator.d.ts +40 -0
- package/dist/utils/output-schema-validator.js +137 -0
- package/dist/utils/output-schema-validator.js.map +1 -0
- package/dist/utils/safety-misc.d.ts +24 -0
- package/dist/utils/safety-misc.js +91 -0
- package/dist/utils/safety-misc.js.map +1 -0
- package/dist/utils/session-enhancements.d.ts +40 -0
- package/dist/utils/session-enhancements.js +118 -0
- package/dist/utils/session-enhancements.js.map +1 -0
- package/dist/utils/shell-snapshot.d.ts +38 -0
- package/dist/utils/shell-snapshot.js +323 -0
- package/dist/utils/shell-snapshot.js.map +1 -0
- package/dist/utils/stream-json-formatter.d.ts +77 -0
- package/dist/utils/stream-json-formatter.js +61 -0
- package/dist/utils/stream-json-formatter.js.map +1 -0
- package/dist/workflows/lobster-engine.d.ts +43 -0
- package/dist/workflows/lobster-engine.js +167 -0
- package/dist/workflows/lobster-engine.js.map +1 -0
- package/package.json +3 -6
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Action Runner
|
|
3
|
+
*
|
|
4
|
+
* Runs Code Buddy as a GitHub Action for PR review, issue triage, and implementation.
|
|
5
|
+
*/
|
|
6
|
+
export interface GitHubActionConfig {
|
|
7
|
+
token: string;
|
|
8
|
+
event: 'pull_request' | 'issues' | 'push';
|
|
9
|
+
repo: string;
|
|
10
|
+
prNumber?: number;
|
|
11
|
+
issueNumber?: number;
|
|
12
|
+
mode: 'review' | 'triage' | 'implement';
|
|
13
|
+
}
|
|
14
|
+
export declare class GitHubActionRunner {
|
|
15
|
+
private config;
|
|
16
|
+
/**
|
|
17
|
+
* Parse GitHub event payload into config
|
|
18
|
+
*/
|
|
19
|
+
parseEvent(eventPayload: Record<string, unknown>): GitHubActionConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Generate a structured review comment for a PR diff
|
|
22
|
+
*/
|
|
23
|
+
generateReviewComment(diff: string, files: string[]): string;
|
|
24
|
+
/**
|
|
25
|
+
* Generate suggested labels for issue triage
|
|
26
|
+
*/
|
|
27
|
+
generateTriageLabel(title: string, body: string): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Format result for GitHub Actions output ($GITHUB_OUTPUT)
|
|
30
|
+
*/
|
|
31
|
+
formatActionOutput(result: Record<string, unknown>): string;
|
|
32
|
+
/**
|
|
33
|
+
* Generate the action.yml content
|
|
34
|
+
*/
|
|
35
|
+
createActionYaml(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Get current config
|
|
38
|
+
*/
|
|
39
|
+
getConfig(): GitHubActionConfig | null;
|
|
40
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Action Runner
|
|
3
|
+
*
|
|
4
|
+
* Runs Code Buddy as a GitHub Action for PR review, issue triage, and implementation.
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// GitHubActionRunner
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class GitHubActionRunner {
|
|
11
|
+
config = null;
|
|
12
|
+
/**
|
|
13
|
+
* Parse GitHub event payload into config
|
|
14
|
+
*/
|
|
15
|
+
parseEvent(eventPayload) {
|
|
16
|
+
const action = eventPayload.action;
|
|
17
|
+
const repository = eventPayload.repository;
|
|
18
|
+
const pullRequest = eventPayload.pull_request;
|
|
19
|
+
const issue = eventPayload.issue;
|
|
20
|
+
const repo = repository?.full_name || '';
|
|
21
|
+
const token = process.env.GITHUB_TOKEN || process.env.INPUT_ANTHROPIC_API_KEY || '';
|
|
22
|
+
let event = 'push';
|
|
23
|
+
let mode = 'implement';
|
|
24
|
+
let prNumber;
|
|
25
|
+
let issueNumber;
|
|
26
|
+
if (pullRequest) {
|
|
27
|
+
event = 'pull_request';
|
|
28
|
+
prNumber = pullRequest.number;
|
|
29
|
+
mode = 'review';
|
|
30
|
+
}
|
|
31
|
+
else if (issue) {
|
|
32
|
+
event = 'issues';
|
|
33
|
+
issueNumber = issue.number;
|
|
34
|
+
mode = 'triage';
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
event = 'push';
|
|
38
|
+
mode = 'implement';
|
|
39
|
+
}
|
|
40
|
+
// Override mode from env if set
|
|
41
|
+
const envMode = process.env.INPUT_MODE;
|
|
42
|
+
if (envMode && ['review', 'triage', 'implement'].includes(envMode)) {
|
|
43
|
+
mode = envMode;
|
|
44
|
+
}
|
|
45
|
+
this.config = { token, event, repo, prNumber, issueNumber, mode };
|
|
46
|
+
logger.debug(`Parsed GitHub event: ${event}, mode: ${mode}, repo: ${repo}`);
|
|
47
|
+
return this.config;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate a structured review comment for a PR diff
|
|
51
|
+
*/
|
|
52
|
+
generateReviewComment(diff, files) {
|
|
53
|
+
const fileList = files.map(f => `- \`${f}\``).join('\n');
|
|
54
|
+
const diffLines = diff.split('\n');
|
|
55
|
+
const additions = diffLines.filter(l => l.startsWith('+')).length;
|
|
56
|
+
const deletions = diffLines.filter(l => l.startsWith('-')).length;
|
|
57
|
+
const comment = [
|
|
58
|
+
'## Code Buddy AI Review',
|
|
59
|
+
'',
|
|
60
|
+
`**Files changed (${files.length}):**`,
|
|
61
|
+
fileList,
|
|
62
|
+
'',
|
|
63
|
+
`**Changes:** +${additions} / -${deletions} lines`,
|
|
64
|
+
'',
|
|
65
|
+
'### Summary',
|
|
66
|
+
'',
|
|
67
|
+
'AI review of the changes in this pull request.',
|
|
68
|
+
'',
|
|
69
|
+
'### Suggestions',
|
|
70
|
+
'',
|
|
71
|
+
'No critical issues found.',
|
|
72
|
+
'',
|
|
73
|
+
'---',
|
|
74
|
+
'*Generated by Code Buddy GitHub Action*',
|
|
75
|
+
].join('\n');
|
|
76
|
+
return comment;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Generate suggested labels for issue triage
|
|
80
|
+
*/
|
|
81
|
+
generateTriageLabel(title, body) {
|
|
82
|
+
const text = `${title} ${body}`.toLowerCase();
|
|
83
|
+
const labels = [];
|
|
84
|
+
if (text.includes('bug') || text.includes('error') || text.includes('crash') || text.includes('fix')) {
|
|
85
|
+
labels.push('bug');
|
|
86
|
+
}
|
|
87
|
+
if (text.includes('feature') || text.includes('request') || text.includes('enhancement')) {
|
|
88
|
+
labels.push('enhancement');
|
|
89
|
+
}
|
|
90
|
+
if (text.includes('doc') || text.includes('documentation') || text.includes('readme')) {
|
|
91
|
+
labels.push('documentation');
|
|
92
|
+
}
|
|
93
|
+
if (text.includes('security') || text.includes('vulnerability') || text.includes('cve')) {
|
|
94
|
+
labels.push('security');
|
|
95
|
+
}
|
|
96
|
+
if (text.includes('performance') || text.includes('slow') || text.includes('optimize')) {
|
|
97
|
+
labels.push('performance');
|
|
98
|
+
}
|
|
99
|
+
if (text.includes('question') || text.includes('help') || text.includes('how to')) {
|
|
100
|
+
labels.push('question');
|
|
101
|
+
}
|
|
102
|
+
if (labels.length === 0) {
|
|
103
|
+
labels.push('needs-triage');
|
|
104
|
+
}
|
|
105
|
+
return labels;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Format result for GitHub Actions output ($GITHUB_OUTPUT)
|
|
109
|
+
*/
|
|
110
|
+
formatActionOutput(result) {
|
|
111
|
+
const lines = [];
|
|
112
|
+
for (const [key, value] of Object.entries(result)) {
|
|
113
|
+
const stringValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
114
|
+
// Handle multiline values with delimiter
|
|
115
|
+
if (stringValue.includes('\n')) {
|
|
116
|
+
lines.push(`${key}<<EOF`);
|
|
117
|
+
lines.push(stringValue);
|
|
118
|
+
lines.push('EOF');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
lines.push(`${key}=${stringValue}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return lines.join('\n');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Generate the action.yml content
|
|
128
|
+
*/
|
|
129
|
+
createActionYaml() {
|
|
130
|
+
return `name: 'Code Buddy AI'
|
|
131
|
+
description: 'AI-powered code review, issue triage, and implementation'
|
|
132
|
+
inputs:
|
|
133
|
+
anthropic_api_key:
|
|
134
|
+
description: 'API key for the AI provider'
|
|
135
|
+
required: true
|
|
136
|
+
model:
|
|
137
|
+
description: 'Model to use for AI tasks'
|
|
138
|
+
required: false
|
|
139
|
+
default: 'grok-3-mini'
|
|
140
|
+
max_turns:
|
|
141
|
+
description: 'Maximum number of agent turns'
|
|
142
|
+
required: false
|
|
143
|
+
default: '10'
|
|
144
|
+
mode:
|
|
145
|
+
description: 'Operation mode: review, triage, or implement'
|
|
146
|
+
required: false
|
|
147
|
+
default: 'review'
|
|
148
|
+
runs:
|
|
149
|
+
using: 'node20'
|
|
150
|
+
main: 'dist/action/index.js'
|
|
151
|
+
branding:
|
|
152
|
+
icon: 'cpu'
|
|
153
|
+
color: 'blue'
|
|
154
|
+
`;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get current config
|
|
158
|
+
*/
|
|
159
|
+
getConfig() {
|
|
160
|
+
return this.config;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=github-action-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-action-runner.js","sourceRoot":"","sources":["../../src/integrations/github-action-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitLab CI/CD Runner
|
|
3
|
+
*
|
|
4
|
+
* Integrates Code Buddy with GitLab CI/CD pipelines for MR review and pipeline automation.
|
|
5
|
+
*/
|
|
6
|
+
export interface GitLabCIConfig {
|
|
7
|
+
token: string;
|
|
8
|
+
projectId: string;
|
|
9
|
+
mergeRequestIid?: number;
|
|
10
|
+
pipelineSource: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class GitLabCIRunner {
|
|
13
|
+
private config;
|
|
14
|
+
/**
|
|
15
|
+
* Parse environment from CI_* env vars
|
|
16
|
+
*/
|
|
17
|
+
parseEnvironment(): GitLabCIConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a review comment for a merge request
|
|
20
|
+
*/
|
|
21
|
+
generateMRComment(diff: string, files: string[]): string;
|
|
22
|
+
/**
|
|
23
|
+
* Format result for CI pipeline artifacts
|
|
24
|
+
*/
|
|
25
|
+
formatPipelineOutput(result: Record<string, unknown>): string;
|
|
26
|
+
/**
|
|
27
|
+
* Generate .gitlab-ci.yml template content
|
|
28
|
+
*/
|
|
29
|
+
createGitLabTemplate(): string;
|
|
30
|
+
/**
|
|
31
|
+
* Get current config
|
|
32
|
+
*/
|
|
33
|
+
getConfig(): GitLabCIConfig | null;
|
|
34
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitLab CI/CD Runner
|
|
3
|
+
*
|
|
4
|
+
* Integrates Code Buddy with GitLab CI/CD pipelines for MR review and pipeline automation.
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// GitLabCIRunner
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class GitLabCIRunner {
|
|
11
|
+
config = null;
|
|
12
|
+
/**
|
|
13
|
+
* Parse environment from CI_* env vars
|
|
14
|
+
*/
|
|
15
|
+
parseEnvironment() {
|
|
16
|
+
const token = process.env.CI_JOB_TOKEN || process.env.GITLAB_TOKEN || '';
|
|
17
|
+
const projectId = process.env.CI_PROJECT_ID || '';
|
|
18
|
+
const pipelineSource = process.env.CI_PIPELINE_SOURCE || 'push';
|
|
19
|
+
const mrIid = process.env.CI_MERGE_REQUEST_IID;
|
|
20
|
+
this.config = {
|
|
21
|
+
token,
|
|
22
|
+
projectId,
|
|
23
|
+
pipelineSource,
|
|
24
|
+
mergeRequestIid: mrIid ? parseInt(mrIid, 10) : undefined,
|
|
25
|
+
};
|
|
26
|
+
logger.debug(`Parsed GitLab CI env: project=${projectId}, source=${pipelineSource}`);
|
|
27
|
+
return this.config;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generate a review comment for a merge request
|
|
31
|
+
*/
|
|
32
|
+
generateMRComment(diff, files) {
|
|
33
|
+
const fileList = files.map(f => `- \`${f}\``).join('\n');
|
|
34
|
+
const diffLines = diff.split('\n');
|
|
35
|
+
const additions = diffLines.filter(l => l.startsWith('+')).length;
|
|
36
|
+
const deletions = diffLines.filter(l => l.startsWith('-')).length;
|
|
37
|
+
const comment = [
|
|
38
|
+
'## Code Buddy AI Review',
|
|
39
|
+
'',
|
|
40
|
+
`**Files changed (${files.length}):**`,
|
|
41
|
+
fileList,
|
|
42
|
+
'',
|
|
43
|
+
`**Changes:** +${additions} / -${deletions} lines`,
|
|
44
|
+
'',
|
|
45
|
+
'### Summary',
|
|
46
|
+
'',
|
|
47
|
+
'AI review of the changes in this merge request.',
|
|
48
|
+
'',
|
|
49
|
+
'### Suggestions',
|
|
50
|
+
'',
|
|
51
|
+
'No critical issues found.',
|
|
52
|
+
'',
|
|
53
|
+
'---',
|
|
54
|
+
'*Generated by Code Buddy GitLab CI*',
|
|
55
|
+
].join('\n');
|
|
56
|
+
return comment;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format result for CI pipeline artifacts
|
|
60
|
+
*/
|
|
61
|
+
formatPipelineOutput(result) {
|
|
62
|
+
return JSON.stringify({
|
|
63
|
+
codebuddy_analysis: {
|
|
64
|
+
timestamp: new Date().toISOString(),
|
|
65
|
+
...result,
|
|
66
|
+
},
|
|
67
|
+
}, null, 2);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Generate .gitlab-ci.yml template content
|
|
71
|
+
*/
|
|
72
|
+
createGitLabTemplate() {
|
|
73
|
+
return `# Code Buddy AI Review for GitLab CI/CD
|
|
74
|
+
#
|
|
75
|
+
# Add this to your .gitlab-ci.yml or include it as a template.
|
|
76
|
+
|
|
77
|
+
stages:
|
|
78
|
+
- review
|
|
79
|
+
|
|
80
|
+
code-buddy-review:
|
|
81
|
+
stage: review
|
|
82
|
+
image: node:20-slim
|
|
83
|
+
only:
|
|
84
|
+
- merge_requests
|
|
85
|
+
script:
|
|
86
|
+
- npm install -g code-buddy
|
|
87
|
+
- code-buddy --non-interactive "Review the changes in this MR and provide feedback"
|
|
88
|
+
variables:
|
|
89
|
+
GROK_API_KEY: $GROK_API_KEY
|
|
90
|
+
artifacts:
|
|
91
|
+
paths:
|
|
92
|
+
- codebuddy-report.json
|
|
93
|
+
when: always
|
|
94
|
+
allow_failure: true
|
|
95
|
+
`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get current config
|
|
99
|
+
*/
|
|
100
|
+
getConfig() {
|
|
101
|
+
return this.config;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=gitlab-ci-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-ci-runner.js","sourceRoot":"","sources":["../../src/integrations/gitlab-ci-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAa5C,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,OAAO,cAAc;IACjB,MAAM,GAA0B,IAAI,CAAC;IAE7C;;OAEG;IACH,gBAAgB;QACd,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;QACzE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;QAClD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC;QAChE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAE/C,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK;YACL,SAAS;YACT,cAAc;YACd,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SACzD,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,iCAAiC,SAAS,YAAY,cAAc,EAAE,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAAY,EAAE,KAAe;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAClE,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAElE,MAAM,OAAO,GAAG;YACd,yBAAyB;YACzB,EAAE;YACF,oBAAoB,KAAK,CAAC,MAAM,MAAM;YACtC,QAAQ;YACR,EAAE;YACF,iBAAiB,SAAS,OAAO,SAAS,QAAQ;YAClD,EAAE;YACF,aAAa;YACb,EAAE;YACF,iDAAiD;YACjD,EAAE;YACF,iBAAiB;YACjB,EAAE;YACF,2BAA2B;YAC3B,EAAE;YACF,KAAK;YACL,qCAAqC;SACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,MAA+B;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,kBAAkB,EAAE;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,GAAG,MAAM;aACV;SACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACd,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO;;;;;;;;;;;;;;;;;;;;;;CAsBV,CAAC;IACA,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Session Linker
|
|
3
|
+
*
|
|
4
|
+
* Links CLI sessions to pull requests for context-aware assistance.
|
|
5
|
+
*/
|
|
6
|
+
export interface PRInfo {
|
|
7
|
+
number: number;
|
|
8
|
+
repo: string;
|
|
9
|
+
title: string;
|
|
10
|
+
body: string;
|
|
11
|
+
state: string;
|
|
12
|
+
draft: boolean;
|
|
13
|
+
url: string;
|
|
14
|
+
branch: string;
|
|
15
|
+
}
|
|
16
|
+
export type ReviewStatus = 'approved' | 'changes_requested' | 'pending' | 'draft' | null;
|
|
17
|
+
export declare class PRSessionLinker {
|
|
18
|
+
private currentPR;
|
|
19
|
+
private reviewStatus;
|
|
20
|
+
/**
|
|
21
|
+
* Link session to a PR by number or URL
|
|
22
|
+
*/
|
|
23
|
+
linkToPR(prIdentifier: string): Promise<PRInfo>;
|
|
24
|
+
/**
|
|
25
|
+
* Get currently linked PR info
|
|
26
|
+
*/
|
|
27
|
+
getCurrentPR(): PRInfo | null;
|
|
28
|
+
/**
|
|
29
|
+
* Get review status of linked PR
|
|
30
|
+
*/
|
|
31
|
+
getReviewStatus(): ReviewStatus;
|
|
32
|
+
/**
|
|
33
|
+
* Remove the PR link
|
|
34
|
+
*/
|
|
35
|
+
unlinkPR(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Format a footer string showing PR status for prompt injection
|
|
38
|
+
*/
|
|
39
|
+
formatPRFooter(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Attempt to auto-detect PR from branch name (stub)
|
|
42
|
+
*/
|
|
43
|
+
autoLinkFromBranch(branch: string): Promise<PRInfo | null>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Session Linker
|
|
3
|
+
*
|
|
4
|
+
* Links CLI sessions to pull requests for context-aware assistance.
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// PRSessionLinker
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class PRSessionLinker {
|
|
11
|
+
currentPR = null;
|
|
12
|
+
reviewStatus = null;
|
|
13
|
+
/**
|
|
14
|
+
* Link session to a PR by number or URL
|
|
15
|
+
*/
|
|
16
|
+
async linkToPR(prIdentifier) {
|
|
17
|
+
let prNumber;
|
|
18
|
+
let repo = '';
|
|
19
|
+
// Parse URL format: https://github.com/owner/repo/pull/123
|
|
20
|
+
const urlMatch = prIdentifier.match(/github\.com\/([^/]+\/[^/]+)\/pull\/(\d+)/);
|
|
21
|
+
if (urlMatch) {
|
|
22
|
+
repo = urlMatch[1];
|
|
23
|
+
prNumber = parseInt(urlMatch[2], 10);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Parse plain number
|
|
27
|
+
prNumber = parseInt(prIdentifier, 10);
|
|
28
|
+
if (isNaN(prNumber)) {
|
|
29
|
+
throw new Error(`Invalid PR identifier: ${prIdentifier}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Stub: in production, fetch from GitHub API
|
|
33
|
+
this.currentPR = {
|
|
34
|
+
number: prNumber,
|
|
35
|
+
repo: repo || 'owner/repo',
|
|
36
|
+
title: `PR #${prNumber}`,
|
|
37
|
+
body: '',
|
|
38
|
+
state: 'open',
|
|
39
|
+
draft: false,
|
|
40
|
+
url: repo
|
|
41
|
+
? `https://github.com/${repo}/pull/${prNumber}`
|
|
42
|
+
: `https://github.com/owner/repo/pull/${prNumber}`,
|
|
43
|
+
branch: `feature/pr-${prNumber}`,
|
|
44
|
+
};
|
|
45
|
+
this.reviewStatus = 'pending';
|
|
46
|
+
logger.debug(`Linked to PR #${prNumber}`);
|
|
47
|
+
return this.currentPR;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get currently linked PR info
|
|
51
|
+
*/
|
|
52
|
+
getCurrentPR() {
|
|
53
|
+
return this.currentPR;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get review status of linked PR
|
|
57
|
+
*/
|
|
58
|
+
getReviewStatus() {
|
|
59
|
+
if (!this.currentPR)
|
|
60
|
+
return null;
|
|
61
|
+
return this.reviewStatus;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Remove the PR link
|
|
65
|
+
*/
|
|
66
|
+
unlinkPR() {
|
|
67
|
+
this.currentPR = null;
|
|
68
|
+
this.reviewStatus = null;
|
|
69
|
+
logger.debug('Unlinked PR');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Format a footer string showing PR status for prompt injection
|
|
73
|
+
*/
|
|
74
|
+
formatPRFooter() {
|
|
75
|
+
if (!this.currentPR) {
|
|
76
|
+
return '';
|
|
77
|
+
}
|
|
78
|
+
const statusIcon = {
|
|
79
|
+
approved: 'approved',
|
|
80
|
+
changes_requested: 'changes requested',
|
|
81
|
+
pending: 'pending review',
|
|
82
|
+
draft: 'draft',
|
|
83
|
+
};
|
|
84
|
+
const statusText = this.reviewStatus
|
|
85
|
+
? statusIcon[this.reviewStatus] || this.reviewStatus
|
|
86
|
+
: 'unknown';
|
|
87
|
+
return `[PR #${this.currentPR.number}: ${this.currentPR.title} | Status: ${statusText} | ${this.currentPR.url}]`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Attempt to auto-detect PR from branch name (stub)
|
|
91
|
+
*/
|
|
92
|
+
async autoLinkFromBranch(branch) {
|
|
93
|
+
logger.debug(`Attempting auto-link from branch: ${branch}`);
|
|
94
|
+
// Stub: in production, use `gh pr list --head <branch>` or API
|
|
95
|
+
// For now, only handle branches that look like PR references
|
|
96
|
+
const prMatch = branch.match(/pr[/-](\d+)/i);
|
|
97
|
+
if (prMatch) {
|
|
98
|
+
return this.linkToPR(prMatch[1]);
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=pr-session-linker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-session-linker.js","sourceRoot":"","sources":["../../src/integrations/pr-session-linker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailscale Integration
|
|
3
|
+
*
|
|
4
|
+
* Manages Tailscale Serve and Funnel for exposing local services
|
|
5
|
+
* to the tailnet or public internet via HTTPS.
|
|
6
|
+
*/
|
|
7
|
+
export interface TailscaleConfig {
|
|
8
|
+
mode: 'serve' | 'funnel';
|
|
9
|
+
port: number;
|
|
10
|
+
hostname?: string;
|
|
11
|
+
authKey?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TailscaleStatus {
|
|
14
|
+
installed: boolean;
|
|
15
|
+
running: boolean;
|
|
16
|
+
hostname: string;
|
|
17
|
+
tailnetName: string;
|
|
18
|
+
ip: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class TailscaleManager {
|
|
21
|
+
private static instance;
|
|
22
|
+
private config;
|
|
23
|
+
private serving;
|
|
24
|
+
static getInstance(): TailscaleManager;
|
|
25
|
+
static resetInstance(): void;
|
|
26
|
+
isInstalled(): boolean;
|
|
27
|
+
getStatus(): TailscaleStatus;
|
|
28
|
+
serve(port: number, path?: string): void;
|
|
29
|
+
funnel(port: number, path?: string): void;
|
|
30
|
+
stop(): void;
|
|
31
|
+
isServing(): boolean;
|
|
32
|
+
getServeUrl(): string | null;
|
|
33
|
+
generateAuthHeaders(): Record<string, string>;
|
|
34
|
+
getConfig(): TailscaleConfig | null;
|
|
35
|
+
setConfig(config: Partial<TailscaleConfig>): void;
|
|
36
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailscale Integration
|
|
3
|
+
*
|
|
4
|
+
* Manages Tailscale Serve and Funnel for exposing local services
|
|
5
|
+
* to the tailnet or public internet via HTTPS.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// TailscaleManager
|
|
10
|
+
// ============================================================================
|
|
11
|
+
export class TailscaleManager {
|
|
12
|
+
static instance = null;
|
|
13
|
+
config = null;
|
|
14
|
+
serving = false;
|
|
15
|
+
static getInstance() {
|
|
16
|
+
if (!TailscaleManager.instance) {
|
|
17
|
+
TailscaleManager.instance = new TailscaleManager();
|
|
18
|
+
}
|
|
19
|
+
return TailscaleManager.instance;
|
|
20
|
+
}
|
|
21
|
+
static resetInstance() {
|
|
22
|
+
TailscaleManager.instance = null;
|
|
23
|
+
}
|
|
24
|
+
isInstalled() {
|
|
25
|
+
logger.debug('Checking if Tailscale is installed');
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
getStatus() {
|
|
29
|
+
const hostname = this.config?.hostname || 'my-machine';
|
|
30
|
+
logger.info(`Getting Tailscale status for ${hostname}`);
|
|
31
|
+
return {
|
|
32
|
+
installed: this.isInstalled(),
|
|
33
|
+
running: this.serving,
|
|
34
|
+
hostname,
|
|
35
|
+
tailnetName: 'tailnet.ts.net',
|
|
36
|
+
ip: '100.64.0.1',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
serve(port, path) {
|
|
40
|
+
logger.info(`Tailscale Serve on port ${port}${path ? ` path=${path}` : ''}`);
|
|
41
|
+
this.config = {
|
|
42
|
+
mode: 'serve',
|
|
43
|
+
port,
|
|
44
|
+
hostname: this.config?.hostname,
|
|
45
|
+
authKey: this.config?.authKey,
|
|
46
|
+
};
|
|
47
|
+
this.serving = true;
|
|
48
|
+
}
|
|
49
|
+
funnel(port, path) {
|
|
50
|
+
logger.info(`Tailscale Funnel on port ${port}${path ? ` path=${path}` : ''}`);
|
|
51
|
+
this.config = {
|
|
52
|
+
mode: 'funnel',
|
|
53
|
+
port,
|
|
54
|
+
hostname: this.config?.hostname,
|
|
55
|
+
authKey: this.config?.authKey,
|
|
56
|
+
};
|
|
57
|
+
this.serving = true;
|
|
58
|
+
}
|
|
59
|
+
stop() {
|
|
60
|
+
logger.info('Stopping Tailscale serve/funnel');
|
|
61
|
+
this.serving = false;
|
|
62
|
+
}
|
|
63
|
+
isServing() {
|
|
64
|
+
return this.serving;
|
|
65
|
+
}
|
|
66
|
+
getServeUrl() {
|
|
67
|
+
if (!this.config || !this.serving) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const hostname = this.config.hostname || 'my-machine';
|
|
71
|
+
return `https://${hostname}.tailnet.ts.net`;
|
|
72
|
+
}
|
|
73
|
+
generateAuthHeaders() {
|
|
74
|
+
logger.debug('Generating Tailscale auth headers');
|
|
75
|
+
const headers = {
|
|
76
|
+
'Tailscale-User-Login': 'user@example.com',
|
|
77
|
+
'Tailscale-User-Name': 'User',
|
|
78
|
+
};
|
|
79
|
+
if (this.config?.authKey) {
|
|
80
|
+
headers['Authorization'] = `Bearer ${this.config.authKey}`;
|
|
81
|
+
}
|
|
82
|
+
return headers;
|
|
83
|
+
}
|
|
84
|
+
getConfig() {
|
|
85
|
+
return this.config;
|
|
86
|
+
}
|
|
87
|
+
setConfig(config) {
|
|
88
|
+
if (this.config) {
|
|
89
|
+
this.config = { ...this.config, ...config };
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.config = {
|
|
93
|
+
mode: config.mode || 'serve',
|
|
94
|
+
port: config.port || 3000,
|
|
95
|
+
hostname: config.hostname,
|
|
96
|
+
authKey: config.authKey,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=tailscale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailscale.js","sourceRoot":"","sources":["../../src/integrations/tailscale.ts"],"names":[],"mappings":"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"}
|