@prodbeam/mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/LICENSE +21 -0
  3. package/README.md +208 -0
  4. package/dist/CLAUDE.md +7 -0
  5. package/dist/adapters/github-mcp.d.ts +25 -0
  6. package/dist/adapters/github-mcp.d.ts.map +1 -0
  7. package/dist/adapters/github-mcp.js +307 -0
  8. package/dist/adapters/github-mcp.js.map +1 -0
  9. package/dist/adapters/jira-mcp.d.ts +14 -0
  10. package/dist/adapters/jira-mcp.d.ts.map +1 -0
  11. package/dist/adapters/jira-mcp.js +159 -0
  12. package/dist/adapters/jira-mcp.js.map +1 -0
  13. package/dist/cli.d.ts +3 -0
  14. package/dist/cli.d.ts.map +1 -0
  15. package/dist/cli.js +256 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/clients/github-client.d.ts +29 -0
  18. package/dist/clients/github-client.d.ts.map +1 -0
  19. package/dist/clients/github-client.js +116 -0
  20. package/dist/clients/github-client.js.map +1 -0
  21. package/dist/clients/jira-client.d.ts +30 -0
  22. package/dist/clients/jira-client.d.ts.map +1 -0
  23. package/dist/clients/jira-client.js +115 -0
  24. package/dist/clients/jira-client.js.map +1 -0
  25. package/dist/clients/types.d.ts +155 -0
  26. package/dist/clients/types.d.ts.map +1 -0
  27. package/dist/clients/types.js +2 -0
  28. package/dist/clients/types.js.map +1 -0
  29. package/dist/commands/init.d.ts +2 -0
  30. package/dist/commands/init.d.ts.map +1 -0
  31. package/dist/commands/init.js +426 -0
  32. package/dist/commands/init.js.map +1 -0
  33. package/dist/commands/prompt.d.ts +18 -0
  34. package/dist/commands/prompt.d.ts.map +1 -0
  35. package/dist/commands/prompt.js +122 -0
  36. package/dist/commands/prompt.js.map +1 -0
  37. package/dist/config/credentials.d.ts +9 -0
  38. package/dist/config/credentials.d.ts.map +1 -0
  39. package/dist/config/credentials.js +87 -0
  40. package/dist/config/credentials.js.map +1 -0
  41. package/dist/config/paths.d.ts +6 -0
  42. package/dist/config/paths.d.ts.map +1 -0
  43. package/dist/config/paths.js +31 -0
  44. package/dist/config/paths.js.map +1 -0
  45. package/dist/config/team-config.d.ts +204 -0
  46. package/dist/config/team-config.d.ts.map +1 -0
  47. package/dist/config/team-config.js +86 -0
  48. package/dist/config/team-config.js.map +1 -0
  49. package/dist/config/thresholds.d.ts +15 -0
  50. package/dist/config/thresholds.d.ts.map +1 -0
  51. package/dist/config/thresholds.js +18 -0
  52. package/dist/config/thresholds.js.map +1 -0
  53. package/dist/config/types.d.ts +42 -0
  54. package/dist/config/types.d.ts.map +1 -0
  55. package/dist/config/types.js +2 -0
  56. package/dist/config/types.js.map +1 -0
  57. package/dist/discovery/github-discovery.d.ts +4 -0
  58. package/dist/discovery/github-discovery.d.ts.map +1 -0
  59. package/dist/discovery/github-discovery.js +46 -0
  60. package/dist/discovery/github-discovery.js.map +1 -0
  61. package/dist/discovery/jira-discovery.d.ts +4 -0
  62. package/dist/discovery/jira-discovery.d.ts.map +1 -0
  63. package/dist/discovery/jira-discovery.js +68 -0
  64. package/dist/discovery/jira-discovery.js.map +1 -0
  65. package/dist/discovery/types.d.ts +40 -0
  66. package/dist/discovery/types.d.ts.map +1 -0
  67. package/dist/discovery/types.js +2 -0
  68. package/dist/discovery/types.js.map +1 -0
  69. package/dist/generators/metrics-calculator.d.ts +5 -0
  70. package/dist/generators/metrics-calculator.d.ts.map +1 -0
  71. package/dist/generators/metrics-calculator.js +101 -0
  72. package/dist/generators/metrics-calculator.js.map +1 -0
  73. package/dist/generators/report-generator.d.ts +25 -0
  74. package/dist/generators/report-generator.d.ts.map +1 -0
  75. package/dist/generators/report-generator.js +375 -0
  76. package/dist/generators/report-generator.js.map +1 -0
  77. package/dist/generators/sprint-analyzer.d.ts +5 -0
  78. package/dist/generators/sprint-analyzer.d.ts.map +1 -0
  79. package/dist/generators/sprint-analyzer.js +88 -0
  80. package/dist/generators/sprint-analyzer.js.map +1 -0
  81. package/dist/history/history-store.d.ts +15 -0
  82. package/dist/history/history-store.d.ts.map +1 -0
  83. package/dist/history/history-store.js +197 -0
  84. package/dist/history/history-store.js.map +1 -0
  85. package/dist/history/snapshot-builder.d.ts +15 -0
  86. package/dist/history/snapshot-builder.d.ts.map +1 -0
  87. package/dist/history/snapshot-builder.js +45 -0
  88. package/dist/history/snapshot-builder.js.map +1 -0
  89. package/dist/history/types.d.ts +33 -0
  90. package/dist/history/types.d.ts.map +1 -0
  91. package/dist/history/types.js +2 -0
  92. package/dist/history/types.js.map +1 -0
  93. package/dist/index.d.ts +3 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +797 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/insights/anomaly-detector.d.ts +28 -0
  98. package/dist/insights/anomaly-detector.d.ts.map +1 -0
  99. package/dist/insights/anomaly-detector.js +154 -0
  100. package/dist/insights/anomaly-detector.js.map +1 -0
  101. package/dist/insights/team-health.d.ts +24 -0
  102. package/dist/insights/team-health.d.ts.map +1 -0
  103. package/dist/insights/team-health.js +151 -0
  104. package/dist/insights/team-health.js.map +1 -0
  105. package/dist/insights/trend-analyzer.d.ts +5 -0
  106. package/dist/insights/trend-analyzer.d.ts.map +1 -0
  107. package/dist/insights/trend-analyzer.js +79 -0
  108. package/dist/insights/trend-analyzer.js.map +1 -0
  109. package/dist/insights/types.d.ts +10 -0
  110. package/dist/insights/types.d.ts.map +1 -0
  111. package/dist/insights/types.js +2 -0
  112. package/dist/insights/types.js.map +1 -0
  113. package/dist/orchestrator/data-fetcher.d.ts +16 -0
  114. package/dist/orchestrator/data-fetcher.d.ts.map +1 -0
  115. package/dist/orchestrator/data-fetcher.js +169 -0
  116. package/dist/orchestrator/data-fetcher.js.map +1 -0
  117. package/dist/orchestrator/time-range.d.ts +8 -0
  118. package/dist/orchestrator/time-range.d.ts.map +1 -0
  119. package/dist/orchestrator/time-range.js +27 -0
  120. package/dist/orchestrator/time-range.js.map +1 -0
  121. package/dist/types/github.d.ts +40 -0
  122. package/dist/types/github.d.ts.map +1 -0
  123. package/dist/types/github.js +2 -0
  124. package/dist/types/github.js.map +1 -0
  125. package/dist/types/jira.d.ts +18 -0
  126. package/dist/types/jira.d.ts.map +1 -0
  127. package/dist/types/jira.js +2 -0
  128. package/dist/types/jira.js.map +1 -0
  129. package/dist/types/retrospective.d.ts +38 -0
  130. package/dist/types/retrospective.d.ts.map +1 -0
  131. package/dist/types/retrospective.js +2 -0
  132. package/dist/types/retrospective.js.map +1 -0
  133. package/dist/types/weekly.d.ts +41 -0
  134. package/dist/types/weekly.d.ts.map +1 -0
  135. package/dist/types/weekly.js +2 -0
  136. package/dist/types/weekly.js.map +1 -0
  137. package/dist/validators.d.ts +236 -0
  138. package/dist/validators.d.ts.map +1 -0
  139. package/dist/validators.js +62 -0
  140. package/dist/validators.js.map +1 -0
  141. package/package.json +72 -0
@@ -0,0 +1,159 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ export class JiraMCPAdapter {
4
+ client = null;
5
+ connected = false;
6
+ static isConfigured() {
7
+ return Boolean(process.env['JIRA_API_TOKEN'] && process.env['JIRA_EMAIL'] && process.env['JIRA_URL']);
8
+ }
9
+ async connect() {
10
+ if (this.connected) {
11
+ return;
12
+ }
13
+ const token = process.env['JIRA_API_TOKEN'];
14
+ const email = process.env['JIRA_EMAIL'];
15
+ const url = process.env['JIRA_URL'];
16
+ if (!token || !email || !url) {
17
+ throw new Error('Jira MCP not configured. Required env vars: JIRA_API_TOKEN, JIRA_EMAIL, JIRA_URL');
18
+ }
19
+ try {
20
+ this.client = new Client({ name: 'prodbeam-jira-adapter', version: '0.1.0' }, { capabilities: {} });
21
+ const transport = new StdioClientTransport({
22
+ command: 'npx',
23
+ args: ['-y', '@anthropic-ai/mcp-server-atlassian'],
24
+ env: {
25
+ ...process.env,
26
+ JIRA_API_TOKEN: token,
27
+ JIRA_EMAIL: email,
28
+ JIRA_URL: url,
29
+ },
30
+ });
31
+ await this.client.connect(transport);
32
+ this.connected = true;
33
+ console.error('[prodbeam] Connected to Jira MCP server');
34
+ }
35
+ catch (error) {
36
+ const message = error instanceof Error ? error.message : 'Unknown error';
37
+ throw new Error(`Failed to connect to Jira MCP: ${message}`);
38
+ }
39
+ }
40
+ async disconnect() {
41
+ if (this.client) {
42
+ try {
43
+ await this.client.close();
44
+ }
45
+ catch {
46
+ }
47
+ this.client = null;
48
+ this.connected = false;
49
+ }
50
+ }
51
+ async fetchActivity(hours = 24) {
52
+ if (!this.connected || !this.client) {
53
+ throw new Error('Not connected to Jira MCP. Call connect() first.');
54
+ }
55
+ const now = new Date();
56
+ const from = new Date(now.getTime() - hours * 60 * 60 * 1000);
57
+ const sinceDate = from.toISOString().split('T')[0] ?? '';
58
+ try {
59
+ const result = (await this.client.callTool({
60
+ name: 'jira_search_issues',
61
+ arguments: {
62
+ jql: `assignee = currentUser() AND updated >= "${sinceDate}" ORDER BY updated DESC`,
63
+ maxResults: 20,
64
+ },
65
+ }));
66
+ const issues = this.parseIssues(result);
67
+ return {
68
+ issues,
69
+ timeRange: {
70
+ from: from.toISOString(),
71
+ to: now.toISOString(),
72
+ },
73
+ };
74
+ }
75
+ catch (error) {
76
+ console.error('[prodbeam] Error fetching Jira issues:', error);
77
+ return {
78
+ issues: [],
79
+ timeRange: {
80
+ from: from.toISOString(),
81
+ to: now.toISOString(),
82
+ },
83
+ };
84
+ }
85
+ }
86
+ async isAvailable() {
87
+ try {
88
+ await this.connect();
89
+ return true;
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ }
95
+ extractText(response) {
96
+ if (!response.content || response.content.length === 0) {
97
+ return '';
98
+ }
99
+ return response.content
100
+ .filter((c) => c.type === 'text' && c.text)
101
+ .map((c) => c.text ?? '')
102
+ .join('\n');
103
+ }
104
+ parseIssues(response) {
105
+ const text = this.extractText(response);
106
+ if (!text)
107
+ return [];
108
+ const issues = [];
109
+ try {
110
+ const data = JSON.parse(text);
111
+ const items = Array.isArray(data)
112
+ ? data
113
+ : (data['issues'] ?? []);
114
+ for (const item of items) {
115
+ const issue = this.extractIssueFromObject(item);
116
+ if (issue)
117
+ issues.push(issue);
118
+ }
119
+ return issues;
120
+ }
121
+ catch {
122
+ }
123
+ const lines = text.split('\n');
124
+ for (const line of lines) {
125
+ const issueMatch = line.match(/([A-Z]+-\d+)\s*[-:]\s*(.+?)(?:\s*\[(.+?)\])?$/);
126
+ if (issueMatch?.[1] && issueMatch[2]) {
127
+ issues.push({
128
+ key: issueMatch[1],
129
+ summary: issueMatch[2].trim(),
130
+ status: issueMatch[3] ?? 'Unknown',
131
+ priority: '',
132
+ assignee: '',
133
+ issueType: '',
134
+ updatedAt: '',
135
+ url: '',
136
+ });
137
+ }
138
+ }
139
+ return issues;
140
+ }
141
+ extractIssueFromObject(obj) {
142
+ const key = obj['key'];
143
+ const fields = obj['fields'];
144
+ if (!key)
145
+ return null;
146
+ const jiraUrl = process.env['JIRA_URL'] ?? '';
147
+ return {
148
+ key,
149
+ summary: fields?.['summary'] ?? '',
150
+ status: fields?.['status']?.['name'] ?? '',
151
+ priority: fields?.['priority']?.['name'] ?? '',
152
+ assignee: fields?.['assignee']?.['displayName'] ?? '',
153
+ issueType: fields?.['issuetype']?.['name'] ?? '',
154
+ updatedAt: fields?.['updated'] ?? '',
155
+ url: jiraUrl ? `${jiraUrl}/browse/${key}` : '',
156
+ };
157
+ }
158
+ }
159
+ //# sourceMappingURL=jira-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-mcp.js","sourceRoot":"","sources":["../../src/adapters/jira-mcp.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,256 @@
1
+ #!/usr/bin/env node
2
+ import { readTeamConfig, teamConfigExists } from './config/team-config.js';
3
+ import { resolveGitHubCredentials, resolveJiraCredentials } from './config/credentials.js';
4
+ import { resolveConfigDir } from './config/paths.js';
5
+ import { runInit } from './commands/init.js';
6
+ import { GitHubClient } from './clients/github-client.js';
7
+ import { JiraClient } from './clients/jira-client.js';
8
+ import { fetchGitHubActivityForUser, fetchTeamGitHubActivity, fetchJiraActivityForUser, fetchTeamJiraActivity, fetchSprintJiraActivity, detectActiveSprint, } from './orchestrator/data-fetcher.js';
9
+ import { dailyTimeRange, weeklyTimeRange, sprintTimeRange } from './orchestrator/time-range.js';
10
+ import { generateDailyReport, generateTeamDailyReport, generateWeeklyReport, generateRetrospective, } from './generators/report-generator.js';
11
+ function parseArgs(argv) {
12
+ const args = argv.slice(2);
13
+ const command = args[0] ?? 'help';
14
+ const flags = {};
15
+ for (let i = 1; i < args.length; i++) {
16
+ const arg = args[i];
17
+ if (arg.startsWith('--') && i + 1 < args.length) {
18
+ const key = arg.slice(2);
19
+ flags[key] = args[++i];
20
+ }
21
+ }
22
+ return { command, flags };
23
+ }
24
+ async function runStandup(flags) {
25
+ const config = requireConfig();
26
+ const email = flags['email'];
27
+ const member = email
28
+ ? config.team.members.find((m) => m.email.toLowerCase() === email.toLowerCase())
29
+ : config.team.members[0];
30
+ if (!member) {
31
+ throw new Error(email ? `${email} is not a team member` : 'No team members configured');
32
+ }
33
+ if (!member.github) {
34
+ throw new Error(`No GitHub username for ${member.email}`);
35
+ }
36
+ const ghCreds = requireGitHubCreds();
37
+ const timeRange = dailyTimeRange();
38
+ const ghClient = new GitHubClient(ghCreds.token);
39
+ const github = await fetchGitHubActivityForUser(ghClient, member.github, config.github.repos, timeRange);
40
+ let jira;
41
+ const jiraCreds = resolveJiraCredentials();
42
+ if (jiraCreds && member.jiraAccountId) {
43
+ const jiraClient = new JiraClient(jiraCreds.host, jiraCreds.email, jiraCreds.apiToken);
44
+ jira = await fetchJiraActivityForUser(jiraClient, member.jiraAccountId, config.jira.projects, timeRange);
45
+ }
46
+ return generateDailyReport({ github, jira });
47
+ }
48
+ async function runTeamStandup() {
49
+ const config = requireConfig();
50
+ const ghCreds = requireGitHubCreds();
51
+ const timeRange = dailyTimeRange();
52
+ const ghClient = new GitHubClient(ghCreds.token);
53
+ const membersWithGH = config.team.members.filter((m) => m.github);
54
+ const usernames = membersWithGH.map((m) => m.github);
55
+ const ghActivities = await fetchTeamGitHubActivity(ghClient, usernames, config.github.repos, timeRange);
56
+ const jiraCreds = resolveJiraCredentials();
57
+ const jiraClient = jiraCreds
58
+ ? new JiraClient(jiraCreds.host, jiraCreds.email, jiraCreds.apiToken)
59
+ : null;
60
+ const memberActivities = [];
61
+ for (let i = 0; i < membersWithGH.length; i++) {
62
+ const member = membersWithGH[i];
63
+ const github = ghActivities[i];
64
+ let jira;
65
+ if (jiraClient && member.jiraAccountId) {
66
+ jira = await fetchJiraActivityForUser(jiraClient, member.jiraAccountId, config.jira.projects, timeRange);
67
+ }
68
+ memberActivities.push({ github, jira });
69
+ }
70
+ return generateTeamDailyReport(memberActivities, config.team.name);
71
+ }
72
+ async function runWeekly(flags) {
73
+ const config = requireConfig();
74
+ const ghCreds = requireGitHubCreds();
75
+ const weeksAgo = flags['weeks-ago'] ? parseInt(flags['weeks-ago'], 10) : 0;
76
+ const timeRange = weeklyTimeRange(weeksAgo);
77
+ const ghClient = new GitHubClient(ghCreds.token);
78
+ const membersWithGH = config.team.members.filter((m) => m.github);
79
+ const usernames = membersWithGH.map((m) => m.github);
80
+ const perMember = await fetchTeamGitHubActivity(ghClient, usernames, config.github.repos, timeRange);
81
+ const github = {
82
+ username: config.team.name,
83
+ commits: perMember.flatMap((a) => a.commits),
84
+ pullRequests: perMember.flatMap((a) => a.pullRequests),
85
+ reviews: perMember.flatMap((a) => a.reviews),
86
+ timeRange,
87
+ };
88
+ let jira;
89
+ const jiraCreds = resolveJiraCredentials();
90
+ if (jiraCreds) {
91
+ const jiraClient = new JiraClient(jiraCreds.host, jiraCreds.email, jiraCreds.apiToken);
92
+ jira = await fetchTeamJiraActivity(jiraClient, config.jira.projects, timeRange);
93
+ }
94
+ return generateWeeklyReport({ github, jira });
95
+ }
96
+ async function runSprintRetro(flags) {
97
+ const config = requireConfig();
98
+ const ghCreds = requireGitHubCreds();
99
+ const jiraCreds = resolveJiraCredentials();
100
+ let sprintName = flags['sprint'];
101
+ let timeRange;
102
+ if (!sprintName && jiraCreds) {
103
+ const jiraClient = new JiraClient(jiraCreds.host, jiraCreds.email, jiraCreds.apiToken);
104
+ const activeSprint = await detectActiveSprint(jiraClient, config.jira.projects);
105
+ if (activeSprint) {
106
+ sprintName = activeSprint.name;
107
+ timeRange = sprintTimeRange(activeSprint.startDate, activeSprint.endDate);
108
+ }
109
+ }
110
+ if (!sprintName) {
111
+ throw new Error('No active sprint detected. Use --sprint "Sprint Name"');
112
+ }
113
+ if (!timeRange) {
114
+ const base = weeklyTimeRange(0);
115
+ const from = new Date(new Date(base.to).getTime() - 14 * 24 * 60 * 60 * 1000);
116
+ timeRange = { from: from.toISOString(), to: base.to };
117
+ }
118
+ const ghClient = new GitHubClient(ghCreds.token);
119
+ const membersWithGH = config.team.members.filter((m) => m.github);
120
+ const usernames = membersWithGH.map((m) => m.github);
121
+ const perMember = await fetchTeamGitHubActivity(ghClient, usernames, config.github.repos, timeRange);
122
+ const github = {
123
+ username: config.team.name,
124
+ commits: perMember.flatMap((a) => a.commits),
125
+ pullRequests: perMember.flatMap((a) => a.pullRequests),
126
+ reviews: perMember.flatMap((a) => a.reviews),
127
+ timeRange,
128
+ };
129
+ let jira;
130
+ if (jiraCreds) {
131
+ const jiraClient = new JiraClient(jiraCreds.host, jiraCreds.email, jiraCreds.apiToken);
132
+ jira = await fetchSprintJiraActivity(jiraClient, sprintName, timeRange);
133
+ }
134
+ const dateRange = {
135
+ from: timeRange.from.split('T')[0],
136
+ to: timeRange.to.split('T')[0],
137
+ };
138
+ return generateRetrospective({ github, jira, sprintName, dateRange });
139
+ }
140
+ function runStatus() {
141
+ const configExists = teamConfigExists();
142
+ const config = configExists ? readTeamConfig() : null;
143
+ const ghCreds = resolveGitHubCredentials();
144
+ const jiraCreds = resolveJiraCredentials();
145
+ const lines = [];
146
+ lines.push('Prodbeam v2.0.0');
147
+ lines.push('');
148
+ lines.push(`Config dir: ${resolveConfigDir()}`);
149
+ lines.push(`Team config: ${config ? `${config.team.name} (${config.team.members.length} members)` : 'Not configured'}`);
150
+ lines.push(`GitHub: ${ghCreds ? 'Configured' : 'Not configured (set GITHUB_TOKEN)'}`);
151
+ lines.push(`Jira: ${jiraCreds ? jiraCreds.host : 'Not configured (set JIRA_HOST, JIRA_EMAIL, JIRA_API_TOKEN)'}`);
152
+ if (config) {
153
+ lines.push('');
154
+ lines.push('Team members:');
155
+ for (const m of config.team.members) {
156
+ const gh = m.github ? `@${m.github}` : 'no GitHub';
157
+ const jira = m.jiraAccountId ? 'Jira linked' : 'no Jira';
158
+ lines.push(` - ${m.name ?? m.email} (${gh}, ${jira})`);
159
+ }
160
+ lines.push('');
161
+ lines.push(`Repos: ${config.github.repos.length}`);
162
+ lines.push(`Jira projects: ${config.jira.projects.join(', ') || 'none'}`);
163
+ }
164
+ return lines.join('\n');
165
+ }
166
+ function showHelp() {
167
+ return `Prodbeam CLI - Engineering Intelligence Reports
168
+
169
+ Usage:
170
+ prodbeam <command> [options]
171
+
172
+ Commands:
173
+ init Interactive setup wizard (start here!)
174
+ standup Personal daily standup (last 24h)
175
+ team-standup Full team standup (last 24h)
176
+ weekly Weekly engineering summary
177
+ sprint-retro Sprint retrospective
178
+ status Show configuration status
179
+ help Show this help message
180
+
181
+ Options:
182
+ --email <email> Member email for standup (default: first member)
183
+ --weeks-ago <n> Week offset for weekly report (default: 0)
184
+ --sprint <name> Sprint name for retro (default: auto-detect)
185
+
186
+ Getting started:
187
+ Run 'prodbeam init' to set up credentials, team, and MCP registration.
188
+
189
+ Environment:
190
+ GITHUB_TOKEN GitHub personal access token
191
+ JIRA_HOST Jira Cloud hostname (e.g., company.atlassian.net)
192
+ JIRA_EMAIL Jira account email
193
+ JIRA_API_TOKEN Jira API token
194
+ PRODBEAM_HOME Config directory (default: ~/.prodbeam)`;
195
+ }
196
+ function requireConfig() {
197
+ const config = readTeamConfig();
198
+ if (!config) {
199
+ console.error('Error: No team config found. Run setup_team via MCP or create ~/.prodbeam/team.json');
200
+ process.exit(1);
201
+ }
202
+ return config;
203
+ }
204
+ function requireGitHubCreds() {
205
+ const creds = resolveGitHubCredentials();
206
+ if (!creds) {
207
+ console.error('Error: GitHub credentials required. Set GITHUB_TOKEN env var.');
208
+ process.exit(1);
209
+ }
210
+ return creds;
211
+ }
212
+ async function main() {
213
+ const { command, flags } = parseArgs(process.argv);
214
+ try {
215
+ let output;
216
+ switch (command) {
217
+ case 'init':
218
+ await runInit();
219
+ return;
220
+ case 'standup':
221
+ output = await runStandup(flags);
222
+ break;
223
+ case 'team-standup':
224
+ output = await runTeamStandup();
225
+ break;
226
+ case 'weekly':
227
+ output = await runWeekly(flags);
228
+ break;
229
+ case 'sprint-retro':
230
+ output = await runSprintRetro(flags);
231
+ break;
232
+ case 'status':
233
+ output = runStatus();
234
+ break;
235
+ case 'help':
236
+ case '--help':
237
+ case '-h':
238
+ output = showHelp();
239
+ break;
240
+ default:
241
+ console.error(`Unknown command: ${command}\n`);
242
+ output = showHelp();
243
+ }
244
+ console.log(output);
245
+ }
246
+ catch (error) {
247
+ const message = error instanceof Error ? error.message : 'Unknown error';
248
+ console.error(`Error: ${message}`);
249
+ process.exit(1);
250
+ }
251
+ }
252
+ main().catch((error) => {
253
+ console.error('Fatal error:', error);
254
+ process.exit(1);
255
+ });
256
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { GitHubCommit, GitHubPullRequest, GitHubReview } from '../types/github.js';
2
+ export declare class GitHubClientError extends Error {
3
+ statusCode: number;
4
+ retryable: boolean;
5
+ constructor(message: string, statusCode: number, retryable: boolean);
6
+ }
7
+ export declare class GitHubClient {
8
+ private token;
9
+ constructor(token: string);
10
+ getAuthenticatedUser(): Promise<{
11
+ login: string;
12
+ name: string | null;
13
+ }>;
14
+ searchUserByEmail(email: string): Promise<string | null>;
15
+ getUserOrgs(username: string): Promise<string[]>;
16
+ getRecentRepos(username: string, sinceDays?: number): Promise<string[]>;
17
+ getCommits(owner: string, repo: string, params: {
18
+ since?: string;
19
+ until?: string;
20
+ author?: string;
21
+ }): Promise<GitHubCommit[]>;
22
+ getPullRequests(owner: string, repo: string, params: {
23
+ state?: 'open' | 'closed' | 'all';
24
+ since?: string;
25
+ }): Promise<GitHubPullRequest[]>;
26
+ getReviews(owner: string, repo: string, prNumber: number, prTitle: string): Promise<GitHubReview[]>;
27
+ private get;
28
+ }
29
+ //# sourceMappingURL=github-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/clients/github-client.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKxF,qBAAa,iBAAkB,SAAQ,KAAK;IAGjC,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,OAAO;gBAFzB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO;CAK5B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAUnB,oBAAoB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAWvE,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWxD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAShD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcnE,UAAU,CACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1D,OAAO,CAAC,YAAY,EAAE,CAAC;IAyBpB,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5D,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmCzB,UAAU,CACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,EAAE,CAAC;YAmBZ,GAAG;CA6BlB"}
@@ -0,0 +1,116 @@
1
+ const GITHUB_API = 'https://api.github.com';
2
+ const DEFAULT_TIMEOUT_MS = 30_000;
3
+ export class GitHubClientError extends Error {
4
+ statusCode;
5
+ retryable;
6
+ constructor(message, statusCode, retryable) {
7
+ super(message);
8
+ this.statusCode = statusCode;
9
+ this.retryable = retryable;
10
+ this.name = 'GitHubClientError';
11
+ }
12
+ }
13
+ export class GitHubClient {
14
+ token;
15
+ constructor(token) {
16
+ this.token = token;
17
+ }
18
+ async getAuthenticatedUser() {
19
+ const user = await this.get('/user');
20
+ return { login: user.login, name: user.name };
21
+ }
22
+ async searchUserByEmail(email) {
23
+ const data = await this.get(`/search/users?q=${encodeURIComponent(email)}+in:email`);
24
+ const user = data.items[0];
25
+ return user?.login ?? null;
26
+ }
27
+ async getUserOrgs(username) {
28
+ const orgs = await this.get(`/users/${encodeURIComponent(username)}/orgs`);
29
+ return orgs.map((o) => o.login);
30
+ }
31
+ async getRecentRepos(username, sinceDays = 90) {
32
+ const cutoff = new Date(Date.now() - sinceDays * 24 * 60 * 60 * 1000);
33
+ const repos = await this.get(`/users/${encodeURIComponent(username)}/repos?sort=pushed&per_page=100&type=all`);
34
+ return repos.filter((r) => new Date(r.pushed_at) >= cutoff).map((r) => r.full_name);
35
+ }
36
+ async getCommits(owner, repo, params) {
37
+ const query = new URLSearchParams();
38
+ if (params.since)
39
+ query.set('since', params.since);
40
+ if (params.until)
41
+ query.set('until', params.until);
42
+ if (params.author)
43
+ query.set('author', params.author);
44
+ query.set('per_page', '100');
45
+ const commits = await this.get(`/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/commits?${query.toString()}`);
46
+ return commits.map((c) => ({
47
+ sha: c.sha.slice(0, 7),
48
+ message: c.commit.message.split('\n')[0] ?? '',
49
+ author: c.author?.login ?? c.commit.author.name,
50
+ date: c.commit.author.date,
51
+ repo: `${owner}/${repo}`,
52
+ url: c.html_url,
53
+ }));
54
+ }
55
+ async getPullRequests(owner, repo, params) {
56
+ const query = new URLSearchParams();
57
+ query.set('state', params.state ?? 'all');
58
+ query.set('sort', 'updated');
59
+ query.set('direction', 'desc');
60
+ query.set('per_page', '100');
61
+ const prs = await this.get(`/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls?${query.toString()}`);
62
+ const filtered = params.since
63
+ ? prs.filter((pr) => new Date(pr.updated_at) >= new Date(params.since))
64
+ : prs;
65
+ return filtered.map((pr) => ({
66
+ number: pr.number,
67
+ title: pr.title,
68
+ state: pr.merged_at ? 'merged' : pr.state === 'closed' ? 'closed' : 'open',
69
+ author: pr.user.login,
70
+ createdAt: pr.created_at,
71
+ updatedAt: pr.updated_at,
72
+ mergedAt: pr.merged_at ?? undefined,
73
+ repo: `${owner}/${repo}`,
74
+ url: pr.html_url,
75
+ additions: pr.additions,
76
+ deletions: pr.deletions,
77
+ }));
78
+ }
79
+ async getReviews(owner, repo, prNumber, prTitle) {
80
+ const reviews = await this.get(`/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${prNumber}/reviews`);
81
+ return reviews
82
+ .filter((r) => r.state !== 'PENDING' && r.state !== 'DISMISSED')
83
+ .map((r) => ({
84
+ pullRequestNumber: prNumber,
85
+ pullRequestTitle: prTitle,
86
+ author: r.user.login,
87
+ state: r.state,
88
+ submittedAt: r.submitted_at,
89
+ repo: `${owner}/${repo}`,
90
+ }));
91
+ }
92
+ async get(path) {
93
+ const url = `${GITHUB_API}${path}`;
94
+ const controller = new AbortController();
95
+ const timeout = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT_MS);
96
+ try {
97
+ const response = await fetch(url, {
98
+ headers: {
99
+ Authorization: `Bearer ${this.token}`,
100
+ Accept: 'application/vnd.github+json',
101
+ 'X-GitHub-Api-Version': '2022-11-28',
102
+ },
103
+ signal: controller.signal,
104
+ });
105
+ if (!response.ok) {
106
+ const retryable = response.status === 429 || response.status >= 500;
107
+ throw new GitHubClientError(`GitHub API error: ${response.status} ${response.statusText} for ${path}`, response.status, retryable);
108
+ }
109
+ return (await response.json());
110
+ }
111
+ finally {
112
+ clearTimeout(timeout);
113
+ }
114
+ }
115
+ }
116
+ //# sourceMappingURL=github-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/clients/github-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { JiraApiProject, JiraApiBoard, JiraApiSprint } from './types.js';
2
+ import type { JiraIssue } from '../types/jira.js';
3
+ export declare class JiraClientError extends Error {
4
+ statusCode: number;
5
+ retryable: boolean;
6
+ constructor(message: string, statusCode: number, retryable: boolean);
7
+ }
8
+ export declare class JiraClient {
9
+ private baseUrl;
10
+ private authHeader;
11
+ constructor(host: string, email: string, apiToken: string);
12
+ getMyself(): Promise<{
13
+ accountId: string;
14
+ displayName: string;
15
+ }>;
16
+ searchUserByEmail(email: string): Promise<{
17
+ accountId: string;
18
+ displayName: string;
19
+ } | null>;
20
+ getProjects(): Promise<JiraApiProject[]>;
21
+ getBoards(projectKey: string): Promise<JiraApiBoard[]>;
22
+ getSprints(boardId: number, state?: 'active' | 'closed' | 'future'): Promise<JiraApiSprint[]>;
23
+ searchIssues(jql: string, fields?: string[]): Promise<JiraIssue[]>;
24
+ getIssue(issueKey: string): Promise<JiraIssue>;
25
+ private mapIssue;
26
+ private get;
27
+ private post;
28
+ private request;
29
+ }
30
+ //# sourceMappingURL=jira-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-client.d.ts","sourceRoot":"","sources":["../../src/clients/jira-client.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,cAAc,EACd,YAAY,EACZ,aAAa,EAKd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,qBAAa,eAAgB,SAAQ,KAAK;IAG/B,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,OAAO;gBAFzB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO;CAK5B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAanD,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAWhE,iBAAiB,CACrB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAkBvD,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAOxC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAUtD,UAAU,CACd,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GACrC,OAAO,CAAC,aAAa,EAAE,CAAC;IAcrB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAyBlE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IASpD,OAAO,CAAC,QAAQ;YAeF,GAAG;YAIH,IAAI;YAIJ,OAAO;CAsCtB"}