@axonflow/sdk 1.6.0 → 1.8.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.
- package/dist/cjs/client.d.ts +196 -1
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +427 -0
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/code-governance.d.ts +197 -0
- package/dist/cjs/types/code-governance.d.ts.map +1 -0
- package/dist/cjs/types/code-governance.js +9 -0
- package/dist/cjs/types/code-governance.js.map +1 -0
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +1 -0
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/esm/client.d.ts +196 -1
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +427 -0
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/code-governance.d.ts +197 -0
- package/dist/esm/types/code-governance.d.ts.map +1 -0
- package/dist/esm/types/code-governance.js +8 -0
- package/dist/esm/types/code-governance.js.map +1 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/index.d.ts.map +1 -1
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/types/index.js.map +1 -1
- package/package.json +1 -1
package/dist/esm/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AxonFlowConfig, ConnectorMetadata, ConnectorInstallRequest, ConnectorResponse, PlanResponse, PlanExecutionResponse, PolicyApprovalResult, PolicyApprovalOptions, AuditResult, AuditOptions, ExecuteQueryOptions, ExecuteQueryResponse, HealthStatus, StaticPolicy, DynamicPolicy, PolicyOverride, ListStaticPoliciesOptions, ListDynamicPoliciesOptions, CreateStaticPolicyRequest, UpdateStaticPolicyRequest, CreateDynamicPolicyRequest, UpdateDynamicPolicyRequest, CreatePolicyOverrideRequest, TestPatternResult, PolicyVersion, EffectivePoliciesOptions } from './types';
|
|
1
|
+
import { AxonFlowConfig, ConnectorMetadata, ConnectorInstallRequest, ConnectorResponse, PlanResponse, PlanExecutionResponse, PolicyApprovalResult, PolicyApprovalOptions, AuditResult, AuditOptions, ExecuteQueryOptions, ExecuteQueryResponse, HealthStatus, StaticPolicy, DynamicPolicy, PolicyOverride, ListStaticPoliciesOptions, ListDynamicPoliciesOptions, CreateStaticPolicyRequest, UpdateStaticPolicyRequest, CreateDynamicPolicyRequest, UpdateDynamicPolicyRequest, CreatePolicyOverrideRequest, TestPatternResult, PolicyVersion, EffectivePoliciesOptions, GitProviderType, ConfigureGitProviderRequest, ConfigureGitProviderResponse, ValidateGitProviderRequest, ValidateGitProviderResponse, ListGitProvidersResponse, CreatePRRequest, CreatePRResponse, PRRecord, ListPRsOptions, ListPRsResponse, CodeGovernanceMetrics, ExportOptions, ExportResponse } from './types';
|
|
2
2
|
/**
|
|
3
3
|
* Main AxonFlow client for invisible AI governance
|
|
4
4
|
*/
|
|
@@ -458,5 +458,200 @@ export declare class AxonFlow {
|
|
|
458
458
|
* @returns Array of effective dynamic policies
|
|
459
459
|
*/
|
|
460
460
|
getEffectiveDynamicPolicies(options?: EffectivePoliciesOptions): Promise<DynamicPolicy[]>;
|
|
461
|
+
/**
|
|
462
|
+
* Validate Git provider credentials before configuration.
|
|
463
|
+
* Use this to verify tokens and connectivity before saving.
|
|
464
|
+
*
|
|
465
|
+
* @param request - Validation request with provider type and credentials
|
|
466
|
+
* @returns Validation result indicating if credentials are valid
|
|
467
|
+
*
|
|
468
|
+
* @example
|
|
469
|
+
* ```typescript
|
|
470
|
+
* const result = await axonflow.validateGitProvider({
|
|
471
|
+
* type: 'github',
|
|
472
|
+
* token: 'ghp_xxxxxxxxxxxx'
|
|
473
|
+
* });
|
|
474
|
+
*
|
|
475
|
+
* if (result.valid) {
|
|
476
|
+
* console.log('Credentials are valid');
|
|
477
|
+
* } else {
|
|
478
|
+
* console.log('Invalid:', result.message);
|
|
479
|
+
* }
|
|
480
|
+
* ```
|
|
481
|
+
*/
|
|
482
|
+
validateGitProvider(request: ValidateGitProviderRequest): Promise<ValidateGitProviderResponse>;
|
|
483
|
+
/**
|
|
484
|
+
* Configure a Git provider for code governance.
|
|
485
|
+
* Supports GitHub, GitLab, and Bitbucket (cloud and self-hosted).
|
|
486
|
+
*
|
|
487
|
+
* @param request - Configuration request with provider type and credentials
|
|
488
|
+
* @returns Configuration result
|
|
489
|
+
*
|
|
490
|
+
* @example
|
|
491
|
+
* ```typescript
|
|
492
|
+
* // Configure GitHub with personal access token
|
|
493
|
+
* await axonflow.configureGitProvider({
|
|
494
|
+
* type: 'github',
|
|
495
|
+
* token: 'ghp_xxxxxxxxxxxx'
|
|
496
|
+
* });
|
|
497
|
+
*
|
|
498
|
+
* // Configure GitLab self-hosted
|
|
499
|
+
* await axonflow.configureGitProvider({
|
|
500
|
+
* type: 'gitlab',
|
|
501
|
+
* token: 'glpat-xxxxxxxxxxxx',
|
|
502
|
+
* baseUrl: 'https://gitlab.mycompany.com'
|
|
503
|
+
* });
|
|
504
|
+
*
|
|
505
|
+
* // Configure GitHub App
|
|
506
|
+
* await axonflow.configureGitProvider({
|
|
507
|
+
* type: 'github',
|
|
508
|
+
* appId: 12345,
|
|
509
|
+
* installationId: 67890,
|
|
510
|
+
* privateKey: '-----BEGIN RSA PRIVATE KEY-----\n...'
|
|
511
|
+
* });
|
|
512
|
+
* ```
|
|
513
|
+
*/
|
|
514
|
+
configureGitProvider(request: ConfigureGitProviderRequest): Promise<ConfigureGitProviderResponse>;
|
|
515
|
+
/**
|
|
516
|
+
* List all configured Git providers for the tenant.
|
|
517
|
+
*
|
|
518
|
+
* @returns List of configured providers
|
|
519
|
+
*
|
|
520
|
+
* @example
|
|
521
|
+
* ```typescript
|
|
522
|
+
* const { providers, count } = await axonflow.listGitProviders();
|
|
523
|
+
* console.log(`${count} providers configured:`);
|
|
524
|
+
* providers.forEach(p => console.log(` - ${p.type}`));
|
|
525
|
+
* ```
|
|
526
|
+
*/
|
|
527
|
+
listGitProviders(): Promise<ListGitProvidersResponse>;
|
|
528
|
+
/**
|
|
529
|
+
* Delete a configured Git provider.
|
|
530
|
+
*
|
|
531
|
+
* @param type - Provider type to delete (github, gitlab, or bitbucket)
|
|
532
|
+
*
|
|
533
|
+
* @example
|
|
534
|
+
* ```typescript
|
|
535
|
+
* await axonflow.deleteGitProvider('github');
|
|
536
|
+
* ```
|
|
537
|
+
*/
|
|
538
|
+
deleteGitProvider(type: GitProviderType): Promise<void>;
|
|
539
|
+
/**
|
|
540
|
+
* Create a Pull Request from LLM-generated code.
|
|
541
|
+
* This creates a PR with full audit trail linking back to the AI request.
|
|
542
|
+
*
|
|
543
|
+
* @param request - PR creation request with repository info and files
|
|
544
|
+
* @returns Created PR details including URL and number
|
|
545
|
+
*
|
|
546
|
+
* @example
|
|
547
|
+
* ```typescript
|
|
548
|
+
* const pr = await axonflow.createPR({
|
|
549
|
+
* owner: 'myorg',
|
|
550
|
+
* repo: 'myrepo',
|
|
551
|
+
* title: 'feat: add user validation utilities',
|
|
552
|
+
* description: 'LLM-generated validation functions',
|
|
553
|
+
* files: [
|
|
554
|
+
* {
|
|
555
|
+
* path: 'src/utils/validation.ts',
|
|
556
|
+
* content: generatedCode,
|
|
557
|
+
* language: 'typescript',
|
|
558
|
+
* action: 'create'
|
|
559
|
+
* }
|
|
560
|
+
* ],
|
|
561
|
+
* agentRequestId: 'req_123',
|
|
562
|
+
* model: 'gpt-4',
|
|
563
|
+
* policiesChecked: ['code-secrets', 'code-unsafe'],
|
|
564
|
+
* secretsDetected: 0,
|
|
565
|
+
* unsafePatterns: 0
|
|
566
|
+
* });
|
|
567
|
+
*
|
|
568
|
+
* console.log(`PR created: ${pr.prUrl}`);
|
|
569
|
+
* ```
|
|
570
|
+
*/
|
|
571
|
+
createPR(request: CreatePRRequest): Promise<CreatePRResponse>;
|
|
572
|
+
/**
|
|
573
|
+
* List Pull Requests created through code governance.
|
|
574
|
+
*
|
|
575
|
+
* @param options - Filtering and pagination options
|
|
576
|
+
* @returns List of PR records
|
|
577
|
+
*
|
|
578
|
+
* @example
|
|
579
|
+
* ```typescript
|
|
580
|
+
* const { prs, count } = await axonflow.listPRs({
|
|
581
|
+
* state: 'open',
|
|
582
|
+
* limit: 10
|
|
583
|
+
* });
|
|
584
|
+
*
|
|
585
|
+
* prs.forEach(pr => {
|
|
586
|
+
* console.log(`#${pr.prNumber}: ${pr.title} (${pr.state})`);
|
|
587
|
+
* if (pr.secretsDetected > 0) {
|
|
588
|
+
* console.log(` Warning: ${pr.secretsDetected} secrets detected`);
|
|
589
|
+
* }
|
|
590
|
+
* });
|
|
591
|
+
* ```
|
|
592
|
+
*/
|
|
593
|
+
listPRs(options?: ListPRsOptions): Promise<ListPRsResponse>;
|
|
594
|
+
/**
|
|
595
|
+
* Get a specific PR record by ID.
|
|
596
|
+
*
|
|
597
|
+
* @param prId - PR record ID (internal ID, not GitHub PR number)
|
|
598
|
+
* @returns PR record details
|
|
599
|
+
*
|
|
600
|
+
* @example
|
|
601
|
+
* ```typescript
|
|
602
|
+
* const pr = await axonflow.getPR('pr_123');
|
|
603
|
+
* console.log(`PR #${pr.prNumber}: ${pr.title}`);
|
|
604
|
+
* ```
|
|
605
|
+
*/
|
|
606
|
+
getPR(prId: string): Promise<PRRecord>;
|
|
607
|
+
/**
|
|
608
|
+
* Sync PR status with the Git provider.
|
|
609
|
+
* This updates the local record with the current state from GitHub/GitLab/Bitbucket.
|
|
610
|
+
*
|
|
611
|
+
* @param prId - PR record ID
|
|
612
|
+
* @returns Updated PR record
|
|
613
|
+
*
|
|
614
|
+
* @example
|
|
615
|
+
* ```typescript
|
|
616
|
+
* const pr = await axonflow.syncPRStatus('pr_123');
|
|
617
|
+
* console.log(`PR is now ${pr.state}`);
|
|
618
|
+
* ```
|
|
619
|
+
*/
|
|
620
|
+
syncPRStatus(prId: string): Promise<PRRecord>;
|
|
621
|
+
/**
|
|
622
|
+
* Get aggregated code governance metrics for the tenant.
|
|
623
|
+
* Returns PR counts, file totals, and security findings.
|
|
624
|
+
*
|
|
625
|
+
* @returns Code governance metrics
|
|
626
|
+
*
|
|
627
|
+
* @example
|
|
628
|
+
* ```typescript
|
|
629
|
+
* const metrics = await axonflow.getCodeGovernanceMetrics();
|
|
630
|
+
* console.log(`Total PRs: ${metrics.totalPrs}`);
|
|
631
|
+
* console.log(`Secrets Detected: ${metrics.totalSecretsDetected}`);
|
|
632
|
+
* ```
|
|
633
|
+
*/
|
|
634
|
+
getCodeGovernanceMetrics(): Promise<CodeGovernanceMetrics>;
|
|
635
|
+
/**
|
|
636
|
+
* Export code governance data for compliance reporting.
|
|
637
|
+
* Supports JSON format with optional date filtering.
|
|
638
|
+
*
|
|
639
|
+
* @param options - Export options
|
|
640
|
+
* @returns Export response with PR records
|
|
641
|
+
*
|
|
642
|
+
* @example
|
|
643
|
+
* ```typescript
|
|
644
|
+
* // Export all data
|
|
645
|
+
* const { records, count } = await axonflow.exportCodeGovernanceData();
|
|
646
|
+
*
|
|
647
|
+
* // Export with date filter
|
|
648
|
+
* const { records } = await axonflow.exportCodeGovernanceData({
|
|
649
|
+
* startDate: '2024-01-01T00:00:00Z',
|
|
650
|
+
* endDate: '2024-12-31T23:59:59Z',
|
|
651
|
+
* state: 'merged'
|
|
652
|
+
* });
|
|
653
|
+
* ```
|
|
654
|
+
*/
|
|
655
|
+
exportCodeGovernanceData(options?: ExportOptions): Promise<ExportResponse>;
|
|
461
656
|
}
|
|
462
657
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/esm/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAId,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EAEZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,iBAAiB,EACjB,aAAa,EACb,wBAAwB,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/client.js
CHANGED
|
@@ -1289,5 +1289,432 @@ export class AxonFlow {
|
|
|
1289
1289
|
}
|
|
1290
1290
|
return this.policyRequest('GET', path);
|
|
1291
1291
|
}
|
|
1292
|
+
// ============================================================================
|
|
1293
|
+
// Code Governance Methods (Enterprise)
|
|
1294
|
+
// ============================================================================
|
|
1295
|
+
/**
|
|
1296
|
+
* Validate Git provider credentials before configuration.
|
|
1297
|
+
* Use this to verify tokens and connectivity before saving.
|
|
1298
|
+
*
|
|
1299
|
+
* @param request - Validation request with provider type and credentials
|
|
1300
|
+
* @returns Validation result indicating if credentials are valid
|
|
1301
|
+
*
|
|
1302
|
+
* @example
|
|
1303
|
+
* ```typescript
|
|
1304
|
+
* const result = await axonflow.validateGitProvider({
|
|
1305
|
+
* type: 'github',
|
|
1306
|
+
* token: 'ghp_xxxxxxxxxxxx'
|
|
1307
|
+
* });
|
|
1308
|
+
*
|
|
1309
|
+
* if (result.valid) {
|
|
1310
|
+
* console.log('Credentials are valid');
|
|
1311
|
+
* } else {
|
|
1312
|
+
* console.log('Invalid:', result.message);
|
|
1313
|
+
* }
|
|
1314
|
+
* ```
|
|
1315
|
+
*/
|
|
1316
|
+
async validateGitProvider(request) {
|
|
1317
|
+
if (this.config.debug) {
|
|
1318
|
+
debugLog('Validating Git provider', { type: request.type });
|
|
1319
|
+
}
|
|
1320
|
+
// Transform camelCase to snake_case for API
|
|
1321
|
+
const apiRequest = {
|
|
1322
|
+
type: request.type,
|
|
1323
|
+
};
|
|
1324
|
+
if (request.token)
|
|
1325
|
+
apiRequest.token = request.token;
|
|
1326
|
+
if (request.baseUrl)
|
|
1327
|
+
apiRequest.base_url = request.baseUrl;
|
|
1328
|
+
if (request.appId)
|
|
1329
|
+
apiRequest.app_id = request.appId;
|
|
1330
|
+
if (request.installationId)
|
|
1331
|
+
apiRequest.installation_id = request.installationId;
|
|
1332
|
+
if (request.privateKey)
|
|
1333
|
+
apiRequest.private_key = request.privateKey;
|
|
1334
|
+
return this.policyRequest('POST', '/api/v1/code-governance/git-providers/validate', apiRequest);
|
|
1335
|
+
}
|
|
1336
|
+
/**
|
|
1337
|
+
* Configure a Git provider for code governance.
|
|
1338
|
+
* Supports GitHub, GitLab, and Bitbucket (cloud and self-hosted).
|
|
1339
|
+
*
|
|
1340
|
+
* @param request - Configuration request with provider type and credentials
|
|
1341
|
+
* @returns Configuration result
|
|
1342
|
+
*
|
|
1343
|
+
* @example
|
|
1344
|
+
* ```typescript
|
|
1345
|
+
* // Configure GitHub with personal access token
|
|
1346
|
+
* await axonflow.configureGitProvider({
|
|
1347
|
+
* type: 'github',
|
|
1348
|
+
* token: 'ghp_xxxxxxxxxxxx'
|
|
1349
|
+
* });
|
|
1350
|
+
*
|
|
1351
|
+
* // Configure GitLab self-hosted
|
|
1352
|
+
* await axonflow.configureGitProvider({
|
|
1353
|
+
* type: 'gitlab',
|
|
1354
|
+
* token: 'glpat-xxxxxxxxxxxx',
|
|
1355
|
+
* baseUrl: 'https://gitlab.mycompany.com'
|
|
1356
|
+
* });
|
|
1357
|
+
*
|
|
1358
|
+
* // Configure GitHub App
|
|
1359
|
+
* await axonflow.configureGitProvider({
|
|
1360
|
+
* type: 'github',
|
|
1361
|
+
* appId: 12345,
|
|
1362
|
+
* installationId: 67890,
|
|
1363
|
+
* privateKey: '-----BEGIN RSA PRIVATE KEY-----\n...'
|
|
1364
|
+
* });
|
|
1365
|
+
* ```
|
|
1366
|
+
*/
|
|
1367
|
+
async configureGitProvider(request) {
|
|
1368
|
+
if (this.config.debug) {
|
|
1369
|
+
debugLog('Configuring Git provider', { type: request.type });
|
|
1370
|
+
}
|
|
1371
|
+
// Transform camelCase to snake_case for API
|
|
1372
|
+
const apiRequest = {
|
|
1373
|
+
type: request.type,
|
|
1374
|
+
};
|
|
1375
|
+
if (request.token)
|
|
1376
|
+
apiRequest.token = request.token;
|
|
1377
|
+
if (request.baseUrl)
|
|
1378
|
+
apiRequest.base_url = request.baseUrl;
|
|
1379
|
+
if (request.appId)
|
|
1380
|
+
apiRequest.app_id = request.appId;
|
|
1381
|
+
if (request.installationId)
|
|
1382
|
+
apiRequest.installation_id = request.installationId;
|
|
1383
|
+
if (request.privateKey)
|
|
1384
|
+
apiRequest.private_key = request.privateKey;
|
|
1385
|
+
return this.policyRequest('POST', '/api/v1/code-governance/git-providers', apiRequest);
|
|
1386
|
+
}
|
|
1387
|
+
/**
|
|
1388
|
+
* List all configured Git providers for the tenant.
|
|
1389
|
+
*
|
|
1390
|
+
* @returns List of configured providers
|
|
1391
|
+
*
|
|
1392
|
+
* @example
|
|
1393
|
+
* ```typescript
|
|
1394
|
+
* const { providers, count } = await axonflow.listGitProviders();
|
|
1395
|
+
* console.log(`${count} providers configured:`);
|
|
1396
|
+
* providers.forEach(p => console.log(` - ${p.type}`));
|
|
1397
|
+
* ```
|
|
1398
|
+
*/
|
|
1399
|
+
async listGitProviders() {
|
|
1400
|
+
if (this.config.debug) {
|
|
1401
|
+
debugLog('Listing Git providers');
|
|
1402
|
+
}
|
|
1403
|
+
return this.policyRequest('GET', '/api/v1/code-governance/git-providers');
|
|
1404
|
+
}
|
|
1405
|
+
/**
|
|
1406
|
+
* Delete a configured Git provider.
|
|
1407
|
+
*
|
|
1408
|
+
* @param type - Provider type to delete (github, gitlab, or bitbucket)
|
|
1409
|
+
*
|
|
1410
|
+
* @example
|
|
1411
|
+
* ```typescript
|
|
1412
|
+
* await axonflow.deleteGitProvider('github');
|
|
1413
|
+
* ```
|
|
1414
|
+
*/
|
|
1415
|
+
async deleteGitProvider(type) {
|
|
1416
|
+
if (this.config.debug) {
|
|
1417
|
+
debugLog('Deleting Git provider', { type });
|
|
1418
|
+
}
|
|
1419
|
+
await this.policyRequest('DELETE', `/api/v1/code-governance/git-providers/${type}`);
|
|
1420
|
+
}
|
|
1421
|
+
/**
|
|
1422
|
+
* Create a Pull Request from LLM-generated code.
|
|
1423
|
+
* This creates a PR with full audit trail linking back to the AI request.
|
|
1424
|
+
*
|
|
1425
|
+
* @param request - PR creation request with repository info and files
|
|
1426
|
+
* @returns Created PR details including URL and number
|
|
1427
|
+
*
|
|
1428
|
+
* @example
|
|
1429
|
+
* ```typescript
|
|
1430
|
+
* const pr = await axonflow.createPR({
|
|
1431
|
+
* owner: 'myorg',
|
|
1432
|
+
* repo: 'myrepo',
|
|
1433
|
+
* title: 'feat: add user validation utilities',
|
|
1434
|
+
* description: 'LLM-generated validation functions',
|
|
1435
|
+
* files: [
|
|
1436
|
+
* {
|
|
1437
|
+
* path: 'src/utils/validation.ts',
|
|
1438
|
+
* content: generatedCode,
|
|
1439
|
+
* language: 'typescript',
|
|
1440
|
+
* action: 'create'
|
|
1441
|
+
* }
|
|
1442
|
+
* ],
|
|
1443
|
+
* agentRequestId: 'req_123',
|
|
1444
|
+
* model: 'gpt-4',
|
|
1445
|
+
* policiesChecked: ['code-secrets', 'code-unsafe'],
|
|
1446
|
+
* secretsDetected: 0,
|
|
1447
|
+
* unsafePatterns: 0
|
|
1448
|
+
* });
|
|
1449
|
+
*
|
|
1450
|
+
* console.log(`PR created: ${pr.prUrl}`);
|
|
1451
|
+
* ```
|
|
1452
|
+
*/
|
|
1453
|
+
async createPR(request) {
|
|
1454
|
+
if (this.config.debug) {
|
|
1455
|
+
debugLog('Creating PR', { owner: request.owner, repo: request.repo, title: request.title });
|
|
1456
|
+
}
|
|
1457
|
+
// Transform camelCase to snake_case for API
|
|
1458
|
+
const apiRequest = {
|
|
1459
|
+
owner: request.owner,
|
|
1460
|
+
repo: request.repo,
|
|
1461
|
+
title: request.title,
|
|
1462
|
+
files: request.files.map(f => ({
|
|
1463
|
+
path: f.path,
|
|
1464
|
+
content: f.content,
|
|
1465
|
+
language: f.language,
|
|
1466
|
+
action: f.action,
|
|
1467
|
+
})),
|
|
1468
|
+
};
|
|
1469
|
+
if (request.description)
|
|
1470
|
+
apiRequest.description = request.description;
|
|
1471
|
+
if (request.baseBranch)
|
|
1472
|
+
apiRequest.base_branch = request.baseBranch;
|
|
1473
|
+
if (request.branchName)
|
|
1474
|
+
apiRequest.branch_name = request.branchName;
|
|
1475
|
+
if (request.draft !== undefined)
|
|
1476
|
+
apiRequest.draft = request.draft;
|
|
1477
|
+
if (request.agentRequestId)
|
|
1478
|
+
apiRequest.agent_request_id = request.agentRequestId;
|
|
1479
|
+
if (request.model)
|
|
1480
|
+
apiRequest.model = request.model;
|
|
1481
|
+
if (request.policiesChecked)
|
|
1482
|
+
apiRequest.policies_checked = request.policiesChecked;
|
|
1483
|
+
if (request.secretsDetected !== undefined)
|
|
1484
|
+
apiRequest.secrets_detected = request.secretsDetected;
|
|
1485
|
+
if (request.unsafePatterns !== undefined)
|
|
1486
|
+
apiRequest.unsafe_patterns = request.unsafePatterns;
|
|
1487
|
+
const response = await this.policyRequest('POST', '/api/v1/code-governance/prs', apiRequest);
|
|
1488
|
+
// Transform snake_case response to camelCase
|
|
1489
|
+
return {
|
|
1490
|
+
prId: response.pr_id,
|
|
1491
|
+
prNumber: response.pr_number,
|
|
1492
|
+
prUrl: response.pr_url,
|
|
1493
|
+
state: response.state,
|
|
1494
|
+
headBranch: response.head_branch,
|
|
1495
|
+
createdAt: response.created_at,
|
|
1496
|
+
};
|
|
1497
|
+
}
|
|
1498
|
+
/**
|
|
1499
|
+
* List Pull Requests created through code governance.
|
|
1500
|
+
*
|
|
1501
|
+
* @param options - Filtering and pagination options
|
|
1502
|
+
* @returns List of PR records
|
|
1503
|
+
*
|
|
1504
|
+
* @example
|
|
1505
|
+
* ```typescript
|
|
1506
|
+
* const { prs, count } = await axonflow.listPRs({
|
|
1507
|
+
* state: 'open',
|
|
1508
|
+
* limit: 10
|
|
1509
|
+
* });
|
|
1510
|
+
*
|
|
1511
|
+
* prs.forEach(pr => {
|
|
1512
|
+
* console.log(`#${pr.prNumber}: ${pr.title} (${pr.state})`);
|
|
1513
|
+
* if (pr.secretsDetected > 0) {
|
|
1514
|
+
* console.log(` Warning: ${pr.secretsDetected} secrets detected`);
|
|
1515
|
+
* }
|
|
1516
|
+
* });
|
|
1517
|
+
* ```
|
|
1518
|
+
*/
|
|
1519
|
+
async listPRs(options) {
|
|
1520
|
+
const params = new URLSearchParams();
|
|
1521
|
+
if (options?.limit)
|
|
1522
|
+
params.set('limit', String(options.limit));
|
|
1523
|
+
if (options?.offset)
|
|
1524
|
+
params.set('offset', String(options.offset));
|
|
1525
|
+
if (options?.state)
|
|
1526
|
+
params.set('state', options.state);
|
|
1527
|
+
const queryString = params.toString();
|
|
1528
|
+
const path = `/api/v1/code-governance/prs${queryString ? `?${queryString}` : ''}`;
|
|
1529
|
+
if (this.config.debug) {
|
|
1530
|
+
debugLog('Listing PRs', { options });
|
|
1531
|
+
}
|
|
1532
|
+
const response = await this.policyRequest('GET', path);
|
|
1533
|
+
// Transform snake_case response to camelCase
|
|
1534
|
+
return {
|
|
1535
|
+
prs: response.prs.map(pr => ({
|
|
1536
|
+
id: pr.id,
|
|
1537
|
+
prNumber: pr.pr_number,
|
|
1538
|
+
prUrl: pr.pr_url,
|
|
1539
|
+
title: pr.title,
|
|
1540
|
+
state: pr.state,
|
|
1541
|
+
owner: pr.owner,
|
|
1542
|
+
repo: pr.repo,
|
|
1543
|
+
headBranch: pr.head_branch,
|
|
1544
|
+
baseBranch: pr.base_branch,
|
|
1545
|
+
filesCount: pr.files_count,
|
|
1546
|
+
secretsDetected: pr.secrets_detected,
|
|
1547
|
+
unsafePatterns: pr.unsafe_patterns,
|
|
1548
|
+
createdAt: pr.created_at,
|
|
1549
|
+
createdBy: pr.created_by,
|
|
1550
|
+
providerType: pr.provider_type,
|
|
1551
|
+
})),
|
|
1552
|
+
count: response.count,
|
|
1553
|
+
};
|
|
1554
|
+
}
|
|
1555
|
+
/**
|
|
1556
|
+
* Get a specific PR record by ID.
|
|
1557
|
+
*
|
|
1558
|
+
* @param prId - PR record ID (internal ID, not GitHub PR number)
|
|
1559
|
+
* @returns PR record details
|
|
1560
|
+
*
|
|
1561
|
+
* @example
|
|
1562
|
+
* ```typescript
|
|
1563
|
+
* const pr = await axonflow.getPR('pr_123');
|
|
1564
|
+
* console.log(`PR #${pr.prNumber}: ${pr.title}`);
|
|
1565
|
+
* ```
|
|
1566
|
+
*/
|
|
1567
|
+
async getPR(prId) {
|
|
1568
|
+
if (this.config.debug) {
|
|
1569
|
+
debugLog('Getting PR', { prId });
|
|
1570
|
+
}
|
|
1571
|
+
const response = await this.policyRequest('GET', `/api/v1/code-governance/prs/${prId}`);
|
|
1572
|
+
// Transform snake_case response to camelCase
|
|
1573
|
+
return {
|
|
1574
|
+
id: response.id,
|
|
1575
|
+
prNumber: response.pr_number,
|
|
1576
|
+
prUrl: response.pr_url,
|
|
1577
|
+
title: response.title,
|
|
1578
|
+
state: response.state,
|
|
1579
|
+
owner: response.owner,
|
|
1580
|
+
repo: response.repo,
|
|
1581
|
+
headBranch: response.head_branch,
|
|
1582
|
+
baseBranch: response.base_branch,
|
|
1583
|
+
filesCount: response.files_count,
|
|
1584
|
+
secretsDetected: response.secrets_detected,
|
|
1585
|
+
unsafePatterns: response.unsafe_patterns,
|
|
1586
|
+
createdAt: response.created_at,
|
|
1587
|
+
createdBy: response.created_by,
|
|
1588
|
+
providerType: response.provider_type,
|
|
1589
|
+
};
|
|
1590
|
+
}
|
|
1591
|
+
/**
|
|
1592
|
+
* Sync PR status with the Git provider.
|
|
1593
|
+
* This updates the local record with the current state from GitHub/GitLab/Bitbucket.
|
|
1594
|
+
*
|
|
1595
|
+
* @param prId - PR record ID
|
|
1596
|
+
* @returns Updated PR record
|
|
1597
|
+
*
|
|
1598
|
+
* @example
|
|
1599
|
+
* ```typescript
|
|
1600
|
+
* const pr = await axonflow.syncPRStatus('pr_123');
|
|
1601
|
+
* console.log(`PR is now ${pr.state}`);
|
|
1602
|
+
* ```
|
|
1603
|
+
*/
|
|
1604
|
+
async syncPRStatus(prId) {
|
|
1605
|
+
if (this.config.debug) {
|
|
1606
|
+
debugLog('Syncing PR status', { prId });
|
|
1607
|
+
}
|
|
1608
|
+
const response = await this.policyRequest('POST', `/api/v1/code-governance/prs/${prId}/sync`);
|
|
1609
|
+
// Transform snake_case response to camelCase
|
|
1610
|
+
return {
|
|
1611
|
+
id: response.id,
|
|
1612
|
+
prNumber: response.pr_number,
|
|
1613
|
+
prUrl: response.pr_url,
|
|
1614
|
+
title: response.title,
|
|
1615
|
+
state: response.state,
|
|
1616
|
+
owner: response.owner,
|
|
1617
|
+
repo: response.repo,
|
|
1618
|
+
headBranch: response.head_branch,
|
|
1619
|
+
baseBranch: response.base_branch,
|
|
1620
|
+
filesCount: response.files_count,
|
|
1621
|
+
secretsDetected: response.secrets_detected,
|
|
1622
|
+
unsafePatterns: response.unsafe_patterns,
|
|
1623
|
+
createdAt: response.created_at,
|
|
1624
|
+
createdBy: response.created_by,
|
|
1625
|
+
providerType: response.provider_type,
|
|
1626
|
+
};
|
|
1627
|
+
}
|
|
1628
|
+
// ============================================================================
|
|
1629
|
+
// Code Governance Metrics and Export Methods (Enterprise)
|
|
1630
|
+
// ============================================================================
|
|
1631
|
+
/**
|
|
1632
|
+
* Get aggregated code governance metrics for the tenant.
|
|
1633
|
+
* Returns PR counts, file totals, and security findings.
|
|
1634
|
+
*
|
|
1635
|
+
* @returns Code governance metrics
|
|
1636
|
+
*
|
|
1637
|
+
* @example
|
|
1638
|
+
* ```typescript
|
|
1639
|
+
* const metrics = await axonflow.getCodeGovernanceMetrics();
|
|
1640
|
+
* console.log(`Total PRs: ${metrics.totalPrs}`);
|
|
1641
|
+
* console.log(`Secrets Detected: ${metrics.totalSecretsDetected}`);
|
|
1642
|
+
* ```
|
|
1643
|
+
*/
|
|
1644
|
+
async getCodeGovernanceMetrics() {
|
|
1645
|
+
if (this.config.debug) {
|
|
1646
|
+
debugLog('Getting code governance metrics');
|
|
1647
|
+
}
|
|
1648
|
+
const response = await this.policyRequest('GET', '/api/v1/code-governance/metrics');
|
|
1649
|
+
return {
|
|
1650
|
+
tenantId: response.tenant_id,
|
|
1651
|
+
totalPrs: response.total_prs,
|
|
1652
|
+
openPrs: response.open_prs,
|
|
1653
|
+
mergedPrs: response.merged_prs,
|
|
1654
|
+
closedPrs: response.closed_prs,
|
|
1655
|
+
totalFiles: response.total_files,
|
|
1656
|
+
totalSecretsDetected: response.total_secrets_detected,
|
|
1657
|
+
totalUnsafePatterns: response.total_unsafe_patterns,
|
|
1658
|
+
firstPrAt: response.first_pr_at,
|
|
1659
|
+
lastPrAt: response.last_pr_at,
|
|
1660
|
+
};
|
|
1661
|
+
}
|
|
1662
|
+
/**
|
|
1663
|
+
* Export code governance data for compliance reporting.
|
|
1664
|
+
* Supports JSON format with optional date filtering.
|
|
1665
|
+
*
|
|
1666
|
+
* @param options - Export options
|
|
1667
|
+
* @returns Export response with PR records
|
|
1668
|
+
*
|
|
1669
|
+
* @example
|
|
1670
|
+
* ```typescript
|
|
1671
|
+
* // Export all data
|
|
1672
|
+
* const { records, count } = await axonflow.exportCodeGovernanceData();
|
|
1673
|
+
*
|
|
1674
|
+
* // Export with date filter
|
|
1675
|
+
* const { records } = await axonflow.exportCodeGovernanceData({
|
|
1676
|
+
* startDate: '2024-01-01T00:00:00Z',
|
|
1677
|
+
* endDate: '2024-12-31T23:59:59Z',
|
|
1678
|
+
* state: 'merged'
|
|
1679
|
+
* });
|
|
1680
|
+
* ```
|
|
1681
|
+
*/
|
|
1682
|
+
async exportCodeGovernanceData(options) {
|
|
1683
|
+
const params = new URLSearchParams();
|
|
1684
|
+
params.set('format', 'json');
|
|
1685
|
+
if (options?.startDate)
|
|
1686
|
+
params.set('start_date', options.startDate);
|
|
1687
|
+
if (options?.endDate)
|
|
1688
|
+
params.set('end_date', options.endDate);
|
|
1689
|
+
if (options?.state)
|
|
1690
|
+
params.set('state', options.state);
|
|
1691
|
+
const query = params.toString();
|
|
1692
|
+
const path = `/api/v1/code-governance/export${query ? '?' + query : ''}`;
|
|
1693
|
+
if (this.config.debug) {
|
|
1694
|
+
debugLog('Exporting code governance data', { path });
|
|
1695
|
+
}
|
|
1696
|
+
const response = await this.policyRequest('GET', path);
|
|
1697
|
+
return {
|
|
1698
|
+
records: response.records.map(r => ({
|
|
1699
|
+
id: r.id,
|
|
1700
|
+
prNumber: r.pr_number,
|
|
1701
|
+
prUrl: r.pr_url,
|
|
1702
|
+
title: r.title,
|
|
1703
|
+
state: r.state,
|
|
1704
|
+
owner: r.owner,
|
|
1705
|
+
repo: r.repo,
|
|
1706
|
+
headBranch: r.head_branch,
|
|
1707
|
+
baseBranch: r.base_branch,
|
|
1708
|
+
filesCount: r.files_count,
|
|
1709
|
+
secretsDetected: r.secrets_detected,
|
|
1710
|
+
unsafePatterns: r.unsafe_patterns,
|
|
1711
|
+
createdAt: r.created_at,
|
|
1712
|
+
createdBy: r.created_by,
|
|
1713
|
+
providerType: r.provider_type,
|
|
1714
|
+
})),
|
|
1715
|
+
count: response.count,
|
|
1716
|
+
exportedAt: response.exported_at,
|
|
1717
|
+
};
|
|
1718
|
+
}
|
|
1292
1719
|
}
|
|
1293
1720
|
//# sourceMappingURL=client.js.map
|