claude-flow-novice 1.3.0 → 1.3.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/.claude-flow-novice/preferences/generation.json +147 -0
- package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
- package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
- package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
- package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
- package/.claude-flow-novice/preferences/project-local.json +91 -0
- package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
- package/.claude-flow-novice/preferences/team-shared.json +195 -0
- package/.claude-flow-novice/preferences/user-global.json +247 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
- package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
- package/CLAUDE.md +81 -0
- package/README-NPM.md +0 -0
- package/package.json +11 -7
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/migration/README.md +434 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
- package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
- package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
- package/src/cli/simple-commands/__tests__/task.test.js +8 -0
- package/src/cli/simple-commands/agent.js +216 -0
- package/src/cli/simple-commands/analysis.js +570 -0
- package/src/cli/simple-commands/automation-executor.js +1603 -0
- package/src/cli/simple-commands/automation.js +627 -0
- package/src/cli/simple-commands/batch-manager.js +338 -0
- package/src/cli/simple-commands/claude-telemetry.js +311 -0
- package/src/cli/simple-commands/claude-track.js +102 -0
- package/src/cli/simple-commands/concurrent-display.js +348 -0
- package/src/cli/simple-commands/config.js +319 -0
- package/src/cli/simple-commands/coordination.js +307 -0
- package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
- package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
- package/src/cli/simple-commands/fix-hook-variables.js +363 -0
- package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
- package/src/cli/simple-commands/github/github-api.js +624 -0
- package/src/cli/simple-commands/github/init.js +543 -0
- package/src/cli/simple-commands/github.js +377 -0
- package/src/cli/simple-commands/goal.js +145 -0
- package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
- package/src/cli/simple-commands/hive-mind/communication.js +740 -0
- package/src/cli/simple-commands/hive-mind/core.js +1031 -0
- package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
- package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
- package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
- package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
- package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
- package/src/cli/simple-commands/hive-mind/queen.js +809 -0
- package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
- package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
- package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
- package/src/cli/simple-commands/hive-mind.js +3112 -0
- package/src/cli/simple-commands/hive.js +140 -0
- package/src/cli/simple-commands/hook-safety.js +671 -0
- package/src/cli/simple-commands/hooks.js +1268 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
- package/src/cli/simple-commands/init/README.md +106 -0
- package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
- package/src/cli/simple-commands/init/agent-copier.js +347 -0
- package/src/cli/simple-commands/init/batch-init.js +663 -0
- package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
- package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
- package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
- package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
- package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
- package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
- package/src/cli/simple-commands/init/help.js +110 -0
- package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
- package/src/cli/simple-commands/init/index.js +1953 -0
- package/src/cli/simple-commands/init/performance-monitor.js +344 -0
- package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
- package/src/cli/simple-commands/init/rollback/index.js +399 -0
- package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
- package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
- package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
- package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
- package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
- package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
- package/src/cli/simple-commands/init/sparc-structure.js +68 -0
- package/src/cli/simple-commands/init/template-copier.js +640 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
- package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
- package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
- package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
- package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
- package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
- package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
- package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
- package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
- package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
- package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
- package/src/cli/simple-commands/init/templates/coordination.md +16 -0
- package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
- package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
- package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
- package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
- package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
- package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
- package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
- package/src/cli/simple-commands/init/templates/settings.json +109 -0
- package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
- package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
- package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
- package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
- package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
- package/src/cli/simple-commands/init/validation/index.js +388 -0
- package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
- package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
- package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
- package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
- package/src/cli/simple-commands/init.js +4 -0
- package/src/cli/simple-commands/mcp-health.js +163 -0
- package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
- package/src/cli/simple-commands/mcp.js +420 -0
- package/src/cli/simple-commands/memory-consolidation.js +631 -0
- package/src/cli/simple-commands/memory.js +345 -0
- package/src/cli/simple-commands/migrate-hooks.js +63 -0
- package/src/cli/simple-commands/monitor.js +417 -0
- package/src/cli/simple-commands/neural.js +148 -0
- package/src/cli/simple-commands/pair-autofix-only.js +755 -0
- package/src/cli/simple-commands/pair-basic.js +751 -0
- package/src/cli/simple-commands/pair-old.js +623 -0
- package/src/cli/simple-commands/pair-working.js +849 -0
- package/src/cli/simple-commands/pair.js +849 -0
- package/src/cli/simple-commands/performance-hooks.js +149 -0
- package/src/cli/simple-commands/performance-metrics.js +601 -0
- package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
- package/src/cli/simple-commands/process-ui.js +274 -0
- package/src/cli/simple-commands/realtime-update-system.js +659 -0
- package/src/cli/simple-commands/sparc/architecture.js +1750 -0
- package/src/cli/simple-commands/sparc/commands.js +575 -0
- package/src/cli/simple-commands/sparc/completion.js +1831 -0
- package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
- package/src/cli/simple-commands/sparc/index.js +321 -0
- package/src/cli/simple-commands/sparc/phase-base.js +430 -0
- package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
- package/src/cli/simple-commands/sparc/refinement.js +1856 -0
- package/src/cli/simple-commands/sparc/specification.js +736 -0
- package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
- package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
- package/src/cli/simple-commands/sparc-modes/code.js +148 -0
- package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
- package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
- package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
- package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
- package/src/cli/simple-commands/sparc-modes/index.js +201 -0
- package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
- package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
- package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
- package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
- package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
- package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
- package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
- package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
- package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
- package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
- package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
- package/src/cli/simple-commands/sparc.js +530 -0
- package/src/cli/simple-commands/start-ui.js +147 -0
- package/src/cli/simple-commands/start-wrapper.js +285 -0
- package/src/cli/simple-commands/start.js +2 -0
- package/src/cli/simple-commands/status.js +303 -0
- package/src/cli/simple-commands/stream-chain-clean.js +221 -0
- package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
- package/src/cli/simple-commands/stream-chain-real.js +408 -0
- package/src/cli/simple-commands/stream-chain-working.js +323 -0
- package/src/cli/simple-commands/stream-chain.js +491 -0
- package/src/cli/simple-commands/stream-processor.js +340 -0
- package/src/cli/simple-commands/swarm-executor.js +253 -0
- package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
- package/src/cli/simple-commands/swarm-ui.js +741 -0
- package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
- package/src/cli/simple-commands/swarm.js +2277 -0
- package/src/cli/simple-commands/task.js +228 -0
- package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
- package/src/cli/simple-commands/timestamp-fix.js +104 -0
- package/src/cli/simple-commands/token-tracker.js +372 -0
- package/src/cli/simple-commands/tool-execution-framework.js +555 -0
- package/src/cli/simple-commands/train-and-stream.js +354 -0
- package/src/cli/simple-commands/training-pipeline.js +874 -0
- package/src/cli/simple-commands/training.js +288 -0
- package/src/cli/simple-commands/verification-hooks.js +336 -0
- package/src/cli/simple-commands/verification-integration.js +464 -0
- package/src/cli/simple-commands/verification-training-integration.js +646 -0
- package/src/cli/simple-commands/verification.js +551 -0
- package/src/cli/simple-commands/web-server.js +929 -0
- package/src/cli/simple-commands/webui-validator.js +136 -0
- package/src/language/README.md +503 -0
- package/src/language/claude-md-generator.js +618 -0
- package/src/language/cli.js +422 -0
- package/src/language/example.js +347 -0
- package/src/language/integration-system.js +619 -0
- package/src/language/language-detector.js +581 -0
|
@@ -0,0 +1,624 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* GitHub API Integration Module
|
|
4
|
+
* Provides authentication, rate limiting, and API wrappers for GitHub workflow commands
|
|
5
|
+
*
|
|
6
|
+
* Enhanced with GitHub CLI Safety Wrapper for secure command execution
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { printSuccess, printError, printWarning, printInfo } from '../utils.js';
|
|
10
|
+
import { githubCli, GitHubCliSafe } from '../../utils/github-cli-safety-wrapper.js';
|
|
11
|
+
|
|
12
|
+
// GitHub API Configuration
|
|
13
|
+
const GITHUB_API_BASE = 'https://api.github.com';
|
|
14
|
+
const GITHUB_RATE_LIMIT = 5000; // API calls per hour
|
|
15
|
+
const GITHUB_WEBHOOK_SECRET = process.env.GITHUB_WEBHOOK_SECRET;
|
|
16
|
+
|
|
17
|
+
class GitHubAPIClient {
|
|
18
|
+
constructor(token = null) {
|
|
19
|
+
this.token = token || process.env.GITHUB_TOKEN;
|
|
20
|
+
this.rateLimitRemaining = GITHUB_RATE_LIMIT;
|
|
21
|
+
this.rateLimitResetTime = null;
|
|
22
|
+
this.lastRequestTime = 0;
|
|
23
|
+
this.requestQueue = [];
|
|
24
|
+
this.isProcessingQueue = false;
|
|
25
|
+
|
|
26
|
+
// Initialize GitHub CLI safety wrapper
|
|
27
|
+
this.cliSafe = new GitHubCliSafe({
|
|
28
|
+
timeout: 60000, // 1 minute timeout for CLI operations
|
|
29
|
+
maxRetries: 3,
|
|
30
|
+
enableRateLimit: true,
|
|
31
|
+
enableLogging: false, // Can be enabled for debugging
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Authentication Methods
|
|
37
|
+
*/
|
|
38
|
+
async authenticate(token = null) {
|
|
39
|
+
if (token) {
|
|
40
|
+
this.token = token;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (!this.token) {
|
|
44
|
+
printError('GitHub token not found. Set GITHUB_TOKEN environment variable or provide token.');
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
const response = await this.request('/user');
|
|
50
|
+
if (response.success) {
|
|
51
|
+
printSuccess(`Authenticated as ${response.data.login}`);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
} catch (error) {
|
|
56
|
+
printError(`Authentication failed: ${error.message}`);
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Rate Limiting Management
|
|
63
|
+
*/
|
|
64
|
+
async checkRateLimit() {
|
|
65
|
+
if (this.rateLimitRemaining <= 1) {
|
|
66
|
+
const resetTime = new Date(this.rateLimitResetTime);
|
|
67
|
+
const now = new Date();
|
|
68
|
+
const waitTime = resetTime.getTime() - now.getTime();
|
|
69
|
+
|
|
70
|
+
if (waitTime > 0) {
|
|
71
|
+
printWarning(`Rate limit exceeded. Waiting ${Math.ceil(waitTime / 1000)}s...`);
|
|
72
|
+
await this.sleep(waitTime);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
updateRateLimitInfo(headers) {
|
|
78
|
+
this.rateLimitRemaining = parseInt(headers['x-ratelimit-remaining'] || '0');
|
|
79
|
+
this.rateLimitResetTime = new Date((parseInt(headers['x-ratelimit-reset']) || 0) * 1000);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Core API Request Method
|
|
84
|
+
*/
|
|
85
|
+
async request(endpoint, options = {}) {
|
|
86
|
+
await this.checkRateLimit();
|
|
87
|
+
|
|
88
|
+
const url = endpoint.startsWith('http') ? endpoint : `${GITHUB_API_BASE}${endpoint}`;
|
|
89
|
+
const headers = {
|
|
90
|
+
Authorization: `token ${this.token}`,
|
|
91
|
+
Accept: 'application/vnd.github.v3+json',
|
|
92
|
+
'User-Agent': 'Claude-Flow-GitHub-Integration',
|
|
93
|
+
...options.headers,
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const requestOptions = {
|
|
97
|
+
method: options.method || 'GET',
|
|
98
|
+
headers,
|
|
99
|
+
...options,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
if (options.body) {
|
|
103
|
+
requestOptions.body = JSON.stringify(options.body);
|
|
104
|
+
headers['Content-Type'] = 'application/json';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
const response = await fetch(url, requestOptions);
|
|
109
|
+
this.updateRateLimitInfo(response.headers);
|
|
110
|
+
|
|
111
|
+
const data = await response.json();
|
|
112
|
+
|
|
113
|
+
if (!response.ok) {
|
|
114
|
+
throw new Error(`GitHub API error: ${data.message || response.statusText}`);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
success: true,
|
|
119
|
+
data,
|
|
120
|
+
headers: response.headers,
|
|
121
|
+
status: response.status,
|
|
122
|
+
};
|
|
123
|
+
} catch (error) {
|
|
124
|
+
return {
|
|
125
|
+
success: false,
|
|
126
|
+
error: error.message,
|
|
127
|
+
status: error.status || 500,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Repository Operations
|
|
134
|
+
*/
|
|
135
|
+
async getRepository(owner, repo) {
|
|
136
|
+
return await this.request(`/repos/${owner}/${repo}`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async listRepositories(options = {}) {
|
|
140
|
+
const params = new URLSearchParams({
|
|
141
|
+
sort: options.sort || 'updated',
|
|
142
|
+
direction: options.direction || 'desc',
|
|
143
|
+
per_page: options.perPage || 30,
|
|
144
|
+
page: options.page || 1,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
return await this.request(`/user/repos?${params}`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async createRepository(repoData) {
|
|
151
|
+
return await this.request('/user/repos', {
|
|
152
|
+
method: 'POST',
|
|
153
|
+
body: repoData,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Pull Request Operations
|
|
159
|
+
*/
|
|
160
|
+
async listPullRequests(owner, repo, options = {}) {
|
|
161
|
+
const params = new URLSearchParams({
|
|
162
|
+
state: options.state || 'open',
|
|
163
|
+
sort: options.sort || 'created',
|
|
164
|
+
direction: options.direction || 'desc',
|
|
165
|
+
per_page: options.perPage || 30,
|
|
166
|
+
page: options.page || 1,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
return await this.request(`/repos/${owner}/${repo}/pulls?${params}`);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async createPullRequest(owner, repo, prData) {
|
|
173
|
+
return await this.request(`/repos/${owner}/${repo}/pulls`, {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
body: prData,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async updatePullRequest(owner, repo, prNumber, prData) {
|
|
180
|
+
return await this.request(`/repos/${owner}/${repo}/pulls/${prNumber}`, {
|
|
181
|
+
method: 'PATCH',
|
|
182
|
+
body: prData,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async mergePullRequest(owner, repo, prNumber, mergeData) {
|
|
187
|
+
return await this.request(`/repos/${owner}/${repo}/pulls/${prNumber}/merge`, {
|
|
188
|
+
method: 'PUT',
|
|
189
|
+
body: mergeData,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
async requestPullRequestReview(owner, repo, prNumber, reviewData) {
|
|
194
|
+
return await this.request(`/repos/${owner}/${repo}/pulls/${prNumber}/requested_reviewers`, {
|
|
195
|
+
method: 'POST',
|
|
196
|
+
body: reviewData,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Issue Operations
|
|
202
|
+
*/
|
|
203
|
+
async listIssues(owner, repo, options = {}) {
|
|
204
|
+
const params = new URLSearchParams({
|
|
205
|
+
state: options.state || 'open',
|
|
206
|
+
sort: options.sort || 'created',
|
|
207
|
+
direction: options.direction || 'desc',
|
|
208
|
+
per_page: options.perPage || 30,
|
|
209
|
+
page: options.page || 1,
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
if (options.labels) {
|
|
213
|
+
params.append('labels', options.labels);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return await this.request(`/repos/${owner}/${repo}/issues?${params}`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async createIssue(owner, repo, issueData) {
|
|
220
|
+
return await this.request(`/repos/${owner}/${repo}/issues`, {
|
|
221
|
+
method: 'POST',
|
|
222
|
+
body: issueData,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async updateIssue(owner, repo, issueNumber, issueData) {
|
|
227
|
+
return await this.request(`/repos/${owner}/${repo}/issues/${issueNumber}`, {
|
|
228
|
+
method: 'PATCH',
|
|
229
|
+
body: issueData,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async addIssueLabels(owner, repo, issueNumber, labels) {
|
|
234
|
+
return await this.request(`/repos/${owner}/${repo}/issues/${issueNumber}/labels`, {
|
|
235
|
+
method: 'POST',
|
|
236
|
+
body: { labels },
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async assignIssue(owner, repo, issueNumber, assignees) {
|
|
241
|
+
return await this.request(`/repos/${owner}/${repo}/issues/${issueNumber}/assignees`, {
|
|
242
|
+
method: 'POST',
|
|
243
|
+
body: { assignees },
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Release Operations
|
|
249
|
+
*/
|
|
250
|
+
async listReleases(owner, repo, options = {}) {
|
|
251
|
+
const params = new URLSearchParams({
|
|
252
|
+
per_page: options.perPage || 30,
|
|
253
|
+
page: options.page || 1,
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
return await this.request(`/repos/${owner}/${repo}/releases?${params}`);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
async createRelease(owner, repo, releaseData) {
|
|
260
|
+
return await this.request(`/repos/${owner}/${repo}/releases`, {
|
|
261
|
+
method: 'POST',
|
|
262
|
+
body: releaseData,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
async updateRelease(owner, repo, releaseId, releaseData) {
|
|
267
|
+
return await this.request(`/repos/${owner}/${repo}/releases/${releaseId}`, {
|
|
268
|
+
method: 'PATCH',
|
|
269
|
+
body: releaseData,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async deleteRelease(owner, repo, releaseId) {
|
|
274
|
+
return await this.request(`/repos/${owner}/${repo}/releases/${releaseId}`, {
|
|
275
|
+
method: 'DELETE',
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Workflow Operations
|
|
281
|
+
*/
|
|
282
|
+
async listWorkflows(owner, repo) {
|
|
283
|
+
return await this.request(`/repos/${owner}/${repo}/actions/workflows`);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async triggerWorkflow(owner, repo, workflowId, ref = 'main', inputs = {}) {
|
|
287
|
+
return await this.request(
|
|
288
|
+
`/repos/${owner}/${repo}/actions/workflows/${workflowId}/dispatches`,
|
|
289
|
+
{
|
|
290
|
+
method: 'POST',
|
|
291
|
+
body: { ref, inputs },
|
|
292
|
+
},
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
async listWorkflowRuns(owner, repo, options = {}) {
|
|
297
|
+
const params = new URLSearchParams({
|
|
298
|
+
per_page: options.perPage || 30,
|
|
299
|
+
page: options.page || 1,
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
if (options.status) {
|
|
303
|
+
params.append('status', options.status);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return await this.request(`/repos/${owner}/${repo}/actions/runs?${params}`);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Branch Operations
|
|
311
|
+
*/
|
|
312
|
+
async listBranches(owner, repo) {
|
|
313
|
+
return await this.request(`/repos/${owner}/${repo}/branches`);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
async createBranch(owner, repo, branchName, sha) {
|
|
317
|
+
return await this.request(`/repos/${owner}/${repo}/git/refs`, {
|
|
318
|
+
method: 'POST',
|
|
319
|
+
body: {
|
|
320
|
+
ref: `refs/heads/${branchName}`,
|
|
321
|
+
sha,
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
async getBranchProtection(owner, repo, branch) {
|
|
327
|
+
return await this.request(`/repos/${owner}/${repo}/branches/${branch}/protection`);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
async updateBranchProtection(owner, repo, branch, protection) {
|
|
331
|
+
return await this.request(`/repos/${owner}/${repo}/branches/${branch}/protection`, {
|
|
332
|
+
method: 'PUT',
|
|
333
|
+
body: protection,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Webhook Operations
|
|
339
|
+
*/
|
|
340
|
+
async listWebhooks(owner, repo) {
|
|
341
|
+
return await this.request(`/repos/${owner}/${repo}/hooks`);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
async createWebhook(owner, repo, webhookData) {
|
|
345
|
+
return await this.request(`/repos/${owner}/${repo}/hooks`, {
|
|
346
|
+
method: 'POST',
|
|
347
|
+
body: webhookData,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
async updateWebhook(owner, repo, hookId, webhookData) {
|
|
352
|
+
return await this.request(`/repos/${owner}/${repo}/hooks/${hookId}`, {
|
|
353
|
+
method: 'PATCH',
|
|
354
|
+
body: webhookData,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
async deleteWebhook(owner, repo, hookId) {
|
|
359
|
+
return await this.request(`/repos/${owner}/${repo}/hooks/${hookId}`, {
|
|
360
|
+
method: 'DELETE',
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Event Processing
|
|
366
|
+
*/
|
|
367
|
+
async processWebhookEvent(event, signature, payload) {
|
|
368
|
+
if (!this.verifyWebhookSignature(signature, payload)) {
|
|
369
|
+
throw new Error('Invalid webhook signature');
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const eventData = JSON.parse(payload);
|
|
373
|
+
|
|
374
|
+
switch (event) {
|
|
375
|
+
case 'push':
|
|
376
|
+
return this.handlePushEvent(eventData);
|
|
377
|
+
case 'pull_request':
|
|
378
|
+
return this.handlePullRequestEvent(eventData);
|
|
379
|
+
case 'issues':
|
|
380
|
+
return this.handleIssuesEvent(eventData);
|
|
381
|
+
case 'release':
|
|
382
|
+
return this.handleReleaseEvent(eventData);
|
|
383
|
+
case 'workflow_run':
|
|
384
|
+
return this.handleWorkflowRunEvent(eventData);
|
|
385
|
+
default:
|
|
386
|
+
printInfo(`Unhandled event type: ${event}`);
|
|
387
|
+
return { handled: false, event };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
verifyWebhookSignature(signature, payload) {
|
|
392
|
+
if (!GITHUB_WEBHOOK_SECRET) {
|
|
393
|
+
printWarning('GITHUB_WEBHOOK_SECRET not set. Skipping signature verification.');
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const crypto = require('crypto');
|
|
398
|
+
const hmac = crypto.createHmac('sha256', GITHUB_WEBHOOK_SECRET);
|
|
399
|
+
hmac.update(payload);
|
|
400
|
+
const expectedSignature = `sha256=${hmac.digest('hex')}`;
|
|
401
|
+
|
|
402
|
+
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Event Handlers
|
|
407
|
+
*/
|
|
408
|
+
async handlePushEvent(eventData) {
|
|
409
|
+
printInfo(`Push event: ${eventData.commits.length} commits to ${eventData.ref}`);
|
|
410
|
+
return { handled: true, event: 'push', data: eventData };
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
async handlePullRequestEvent(eventData) {
|
|
414
|
+
const action = eventData.action;
|
|
415
|
+
const pr = eventData.pull_request;
|
|
416
|
+
printInfo(`Pull request ${action}: #${pr.number} - ${pr.title}`);
|
|
417
|
+
return { handled: true, event: 'pull_request', action, data: eventData };
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
async handleIssuesEvent(eventData) {
|
|
421
|
+
const action = eventData.action;
|
|
422
|
+
const issue = eventData.issue;
|
|
423
|
+
printInfo(`Issue ${action}: #${issue.number} - ${issue.title}`);
|
|
424
|
+
return { handled: true, event: 'issues', action, data: eventData };
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
async handleReleaseEvent(eventData) {
|
|
428
|
+
const action = eventData.action;
|
|
429
|
+
const release = eventData.release;
|
|
430
|
+
printInfo(`Release ${action}: ${release.tag_name} - ${release.name}`);
|
|
431
|
+
return { handled: true, event: 'release', action, data: eventData };
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
async handleWorkflowRunEvent(eventData) {
|
|
435
|
+
const action = eventData.action;
|
|
436
|
+
const workflowRun = eventData.workflow_run;
|
|
437
|
+
printInfo(`Workflow run ${action}: ${workflowRun.name} - ${workflowRun.conclusion}`);
|
|
438
|
+
return { handled: true, event: 'workflow_run', action, data: eventData };
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Utility Methods
|
|
443
|
+
*/
|
|
444
|
+
async sleep(ms) {
|
|
445
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
parseRepository(repoString) {
|
|
449
|
+
const match = repoString.match(/^([^/]+)\/([^/]+)$/);
|
|
450
|
+
if (!match) {
|
|
451
|
+
throw new Error('Invalid repository format. Use: owner/repo');
|
|
452
|
+
}
|
|
453
|
+
return { owner: match[1], repo: match[2] };
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
formatDate(dateString) {
|
|
457
|
+
return new Date(dateString).toLocaleString();
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
formatFileSize(bytes) {
|
|
461
|
+
const units = ['B', 'KB', 'MB', 'GB'];
|
|
462
|
+
let size = bytes;
|
|
463
|
+
let unitIndex = 0;
|
|
464
|
+
|
|
465
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
466
|
+
size /= 1024;
|
|
467
|
+
unitIndex++;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
return `${size.toFixed(2)} ${units[unitIndex]}`;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Safe GitHub CLI Methods
|
|
475
|
+
* These methods use the GitHubCliSafe wrapper for secure command execution
|
|
476
|
+
*/
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Create issue using GitHub CLI (safe alternative to createIssue API method)
|
|
480
|
+
* @param {Object} issueData - Issue data
|
|
481
|
+
* @returns {Promise<Object>} - CLI execution result
|
|
482
|
+
*/
|
|
483
|
+
async createIssueCLI(issueData) {
|
|
484
|
+
try {
|
|
485
|
+
const result = await this.cliSafe.createIssue({
|
|
486
|
+
title: issueData.title,
|
|
487
|
+
body: issueData.body,
|
|
488
|
+
labels: issueData.labels || [],
|
|
489
|
+
assignees: issueData.assignees || [],
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
printSuccess(`Issue created via CLI: ${issueData.title}`);
|
|
493
|
+
return { success: true, data: result };
|
|
494
|
+
} catch (error) {
|
|
495
|
+
printError(`Failed to create issue via CLI: ${error.message}`);
|
|
496
|
+
return { success: false, error: error.message };
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Create PR using GitHub CLI (safe alternative to createPullRequest API method)
|
|
502
|
+
* @param {Object} prData - PR data
|
|
503
|
+
* @returns {Promise<Object>} - CLI execution result
|
|
504
|
+
*/
|
|
505
|
+
async createPullRequestCLI(prData) {
|
|
506
|
+
try {
|
|
507
|
+
const result = await this.cliSafe.createPR({
|
|
508
|
+
title: prData.title,
|
|
509
|
+
body: prData.body,
|
|
510
|
+
base: prData.base || 'main',
|
|
511
|
+
head: prData.head,
|
|
512
|
+
draft: prData.draft || false,
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
printSuccess(`PR created via CLI: ${prData.title}`);
|
|
516
|
+
return { success: true, data: result };
|
|
517
|
+
} catch (error) {
|
|
518
|
+
printError(`Failed to create PR via CLI: ${error.message}`);
|
|
519
|
+
return { success: false, error: error.message };
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Add issue comment using GitHub CLI
|
|
525
|
+
* @param {number} issueNumber - Issue number
|
|
526
|
+
* @param {string} body - Comment body
|
|
527
|
+
* @returns {Promise<Object>} - CLI execution result
|
|
528
|
+
*/
|
|
529
|
+
async addIssueCommentCLI(issueNumber, body) {
|
|
530
|
+
try {
|
|
531
|
+
const result = await this.cliSafe.addIssueComment(issueNumber, body);
|
|
532
|
+
printSuccess(`Comment added to issue #${issueNumber}`);
|
|
533
|
+
return { success: true, data: result };
|
|
534
|
+
} catch (error) {
|
|
535
|
+
printError(`Failed to add comment to issue #${issueNumber}: ${error.message}`);
|
|
536
|
+
return { success: false, error: error.message };
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Add PR comment using GitHub CLI
|
|
542
|
+
* @param {number} prNumber - PR number
|
|
543
|
+
* @param {string} body - Comment body
|
|
544
|
+
* @returns {Promise<Object>} - CLI execution result
|
|
545
|
+
*/
|
|
546
|
+
async addPRCommentCLI(prNumber, body) {
|
|
547
|
+
try {
|
|
548
|
+
const result = await this.cliSafe.addPRComment(prNumber, body);
|
|
549
|
+
printSuccess(`Comment added to PR #${prNumber}`);
|
|
550
|
+
return { success: true, data: result };
|
|
551
|
+
} catch (error) {
|
|
552
|
+
printError(`Failed to add comment to PR #${prNumber}: ${error.message}`);
|
|
553
|
+
return { success: false, error: error.message };
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Create release using GitHub CLI
|
|
559
|
+
* @param {Object} releaseData - Release data
|
|
560
|
+
* @returns {Promise<Object>} - CLI execution result
|
|
561
|
+
*/
|
|
562
|
+
async createReleaseCLI(releaseData) {
|
|
563
|
+
try {
|
|
564
|
+
const result = await this.cliSafe.createRelease({
|
|
565
|
+
tag: releaseData.tag_name,
|
|
566
|
+
title: releaseData.name,
|
|
567
|
+
body: releaseData.body,
|
|
568
|
+
prerelease: releaseData.prerelease || false,
|
|
569
|
+
draft: releaseData.draft || false,
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
printSuccess(`Release created via CLI: ${releaseData.tag_name}`);
|
|
573
|
+
return { success: true, data: result };
|
|
574
|
+
} catch (error) {
|
|
575
|
+
printError(`Failed to create release via CLI: ${error.message}`);
|
|
576
|
+
return { success: false, error: error.message };
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* Check GitHub CLI authentication and availability
|
|
582
|
+
* @returns {Promise<boolean>} - True if CLI is ready to use
|
|
583
|
+
*/
|
|
584
|
+
async checkCLIStatus() {
|
|
585
|
+
try {
|
|
586
|
+
const isAvailable = await this.cliSafe.checkGitHubCli();
|
|
587
|
+
if (!isAvailable) {
|
|
588
|
+
printWarning('GitHub CLI is not installed or not in PATH');
|
|
589
|
+
return false;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
const isAuthenticated = await this.cliSafe.checkAuthentication();
|
|
593
|
+
if (!isAuthenticated) {
|
|
594
|
+
printWarning('GitHub CLI is not authenticated. Run: gh auth login');
|
|
595
|
+
return false;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
printSuccess('GitHub CLI is ready for use');
|
|
599
|
+
return true;
|
|
600
|
+
} catch (error) {
|
|
601
|
+
printError(`GitHub CLI status check failed: ${error.message}`);
|
|
602
|
+
return false;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Get GitHub CLI wrapper statistics
|
|
608
|
+
* @returns {Object} - Usage statistics
|
|
609
|
+
*/
|
|
610
|
+
getCLIStats() {
|
|
611
|
+
return this.cliSafe.getStats();
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Cleanup CLI resources (call before shutdown)
|
|
616
|
+
*/
|
|
617
|
+
async cleanupCLI() {
|
|
618
|
+
await this.cliSafe.cleanup();
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Export singleton instance
|
|
623
|
+
export const githubAPI = new GitHubAPIClient();
|
|
624
|
+
export default GitHubAPIClient;
|