| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- #!/usr/bin/env node
- import { GogsClient } from './dist/gogs-client.js';
- import dotenv from 'dotenv';
- dotenv.config();
- const client = new GogsClient({
- serverUrl: process.env.GOGS_SERVER_URL,
- accessToken: process.env.GOGS_ACCESS_TOKEN,
- });
- const owner = 'claude';
- const repo = 'gogs-mcp';
- const issueNumber = 4;
- async function main() {
- try {
- // Step 1: Fetch issue #4
- console.log('Fetching issue #4...');
- const issue = await client.getIssue(owner, repo, issueNumber);
- console.log(`Issue #${issue.number}: ${issue.title}`);
- console.log(`Body: ${issue.body}`);
- console.log('---');
- // Step 2: Fetch all comments
- console.log('Fetching comments...');
- const comments = await client.listIssueComments(owner, repo, issueNumber);
- console.log(`Found ${comments.length} comments:`);
- comments.forEach((comment, idx) => {
- console.log(`\nComment ${idx + 1} by ${comment.user.login}:`);
- console.log(comment.body);
- });
- console.log('---');
- // Step 3: Get all labels
- console.log('Fetching available labels...');
- const labels = await client.listLabels(owner, repo);
- console.log(`Found ${labels.length} labels:`);
- labels.forEach(label => {
- console.log(`- ${label.name} (ID: ${label.id}, Color: ${label.color})`);
- });
- console.log('---');
- // Step 4: Get current user
- const currentUser = await client.getCurrentUser();
- console.log(`Current user: ${currentUser.username}`);
- console.log('---');
- // Step 5: Create new issues based on the requirements
- const featuresToCreate = [
- {
- title: 'Feature: Milestones support',
- body: `## Description
- Add support for Gogs Milestones functionality to the MCP server.
- ## Why This Feature?
- Essential for project management - allows grouping issues and tracking progress towards specific goals.
- ## Requirements
- - Implement \`list_milestones\` tool
- - Implement \`get_milestone\` tool
- - Implement \`create_milestone\` tool
- - Implement \`update_milestone\` tool
- - Implement \`delete_milestone\` tool
- - Add proper TypeScript types for Milestone objects
- - Update documentation with usage examples
- ## Related
- Requested by @fszontagh in #${issueNumber}
- ## API Reference
- See Gogs API documentation for milestones endpoints.`,
- labels: ['enhancement', 'feature']
- },
- {
- title: 'Feature: Organizations & Teams support',
- body: `## Description
- Add support for Gogs Organizations and Teams functionality to the MCP server.
- ## Why This Feature?
- Critical for multi-user workflows - enables proper access control and team collaboration.
- ## Requirements
- - Implement \`list_orgs\` tool
- - Implement \`get_org\` tool
- - Implement \`create_org\` tool
- - Implement \`list_teams\` tool
- - Implement \`get_team\` tool
- - Implement \`create_team\` tool
- - Implement \`add_team_member\` tool
- - Implement \`remove_team_member\` tool
- - Add proper TypeScript types for Organization and Team objects
- - Update documentation with usage examples
- ## Related
- Requested by @fszontagh in #${issueNumber}
- ## API Reference
- See Gogs API documentation for organizations and teams endpoints.`,
- labels: ['enhancement', 'feature']
- },
- {
- title: 'Feature: Webhooks support',
- body: `## Description
- Add support for Gogs Webhooks functionality to the MCP server.
- ## Why This Feature?
- Important for CI/CD integration - enables automated workflows and external service notifications.
- ## Requirements
- - Implement \`list_hooks\` tool
- - Implement \`get_hook\` tool
- - Implement \`create_hook\` tool
- - Implement \`update_hook\` tool
- - Implement \`delete_hook\` tool
- - Implement \`test_hook\` tool
- - Add proper TypeScript types for Webhook objects
- - Support different webhook event types
- - Update documentation with usage examples
- ## Related
- Requested by @fszontagh in #${issueNumber}
- ## API Reference
- See Gogs API documentation for webhooks endpoints.`,
- labels: ['enhancement', 'feature']
- },
- {
- title: 'Feature: Collaborators support',
- body: `## Description
- Add support for Gogs Collaborators functionality to the MCP server.
- ## Why This Feature?
- Necessary for repository access management - allows managing who can contribute to repositories.
- ## Requirements
- - Implement \`list_collaborators\` tool
- - Implement \`check_collaborator\` tool
- - Implement \`add_collaborator\` tool
- - Implement \`remove_collaborator\` tool
- - Add proper TypeScript types for Collaborator objects
- - Update documentation with usage examples
- ## Related
- Requested by @fszontagh in #${issueNumber}
- ## API Reference
- See Gogs API documentation for collaborators endpoints.`,
- labels: ['enhancement', 'feature']
- },
- {
- title: 'Feature: User Followers support',
- body: `## Description
- Add support for Gogs User Followers functionality to the MCP server.
- ## Why This Feature?
- Useful for social features - enables tracking user relationships and building community features.
- ## Requirements
- - Implement \`list_followers\` tool
- - Implement \`list_following\` tool
- - Implement \`check_following\` tool
- - Implement \`follow_user\` tool
- - Implement \`unfollow_user\` tool
- - Add proper TypeScript types for Follower relationships
- - Update documentation with usage examples
- ## Related
- Requested by @fszontagh in #${issueNumber}
- ## API Reference
- See Gogs API documentation for user followers endpoints.`,
- labels: ['enhancement', 'feature']
- }
- ];
- // Find label IDs
- const enhancementLabel = labels.find(l => l.name === 'enhancement');
- const featureLabel = labels.find(l => l.name === 'feature');
- if (!enhancementLabel || !featureLabel) {
- console.log('Required labels not found. Creating them...');
- // Would need to create labels here if they don't exist
- }
- console.log('Creating new issues...');
- const createdIssues = [];
- for (const feature of featuresToCreate) {
- console.log(`Creating issue: ${feature.title}`);
- const newIssue = await client.createIssue(owner, repo, {
- title: feature.title,
- body: feature.body,
- assignee: currentUser.username,
- });
- console.log(`Created issue #${newIssue.number}: ${newIssue.title}`);
- createdIssues.push(newIssue);
- // Add labels if they exist
- const labelIds = [];
- if (enhancementLabel) labelIds.push(enhancementLabel.id);
- if (featureLabel) labelIds.push(featureLabel.id);
- if (labelIds.length > 0) {
- await client.addIssueLabels(owner, repo, newIssue.number, labelIds);
- console.log(`Added labels to issue #${newIssue.number}`);
- }
- // Small delay to avoid rate limiting
- await new Promise(resolve => setTimeout(resolve, 500));
- }
- // Step 6: Post a summary comment to issue #4
- const issueLinks = createdIssues.map(i => `- #${i.number}: ${i.title}`).join('\n');
- const summaryComment = `✅ I've created the following issues as requested:
- ${issueLinks}
- All issues have been:
- - Assigned to @${currentUser.username}
- - Labeled with \`enhancement\` and \`feature\`
- - Properly documented with requirements and API references
- - Cross-referenced to this issue (#${issueNumber})
- Each issue is ready for implementation. As per your instructions, I'm not closing this issue.`;
- console.log('\nPosting summary comment to issue #4...');
- await client.createIssueComment(owner, repo, issueNumber, summaryComment);
- console.log('Summary comment posted!');
- console.log('\n✅ All tasks completed successfully!');
- } catch (error) {
- console.error('Error:', error.message);
- if (error.response) {
- console.error('Response data:', error.response.data);
- }
- // Post error comment to issue
- try {
- await client.createIssueComment(
- owner,
- repo,
- issueNumber,
- `❌ Encountered an error while processing this issue:\n\n\`\`\`\n${error.message}\n\`\`\`\n\nPlease check the logs for more details.`
- );
- } catch (commentError) {
- console.error('Failed to post error comment:', commentError.message);
- }
- process.exit(1);
- }
- }
- main();
|