proagents 1.6.16 → 1.6.18
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/settings.local.json +169 -0
- package/COMMANDS.md +595 -0
- package/README.md +22 -64
- package/bin/proagents.js +0 -2
- package/lib/commands/init.js +4 -174
- package/package.json +2 -7
- package/.proagents/ai-models/README.md +0 -141
- package/.proagents/ai-models/cost-management.md +0 -362
- package/.proagents/ai-models/fallbacks.md +0 -342
- package/.proagents/ai-models/model-config.md +0 -318
- package/.proagents/ai-models/task-routing.md +0 -503
- package/.proagents/ai-training/README.md +0 -155
- package/.proagents/ai-training/continuous-learning.md +0 -413
- package/.proagents/ai-training/domain-knowledge.md +0 -378
- package/.proagents/ai-training/pattern-learning.md +0 -455
- package/.proagents/ai-training/training-data.md +0 -337
- package/.proagents/ai-training/user-preferences.md +0 -346
- package/.proagents/approval-workflows/README.md +0 -146
- package/.proagents/approval-workflows/approval-config.md +0 -332
- package/.proagents/approval-workflows/approval-stages.md +0 -503
- package/.proagents/approval-workflows/emergency-bypass.md +0 -351
- package/.proagents/approval-workflows/examples.md +0 -859
- package/.proagents/approval-workflows/notifications.md +0 -320
- package/.proagents/compliance/README.md +0 -206
- package/.proagents/compliance/access-control.md +0 -310
- package/.proagents/compliance/audit-logging.md +0 -444
- package/.proagents/compliance/compliance-frameworks.md +0 -429
- package/.proagents/compliance/reports.md +0 -491
- package/.proagents/compliance/retention-policies.md +0 -454
- package/.proagents/config-versioning/README.md +0 -120
- package/.proagents/config-versioning/changelog.md +0 -300
- package/.proagents/config-versioning/rollback.md +0 -283
- package/.proagents/config-versioning/versioning.md +0 -330
- package/.proagents/contract-testing/README.md +0 -223
- package/.proagents/contract-testing/contract-testing.md +0 -614
- package/.proagents/contract-testing/pact-integration.md +0 -507
- package/.proagents/contract-testing/schema-validation.md +0 -565
- package/.proagents/dependency-management/README.md +0 -140
- package/.proagents/dependency-management/automation.md +0 -363
- package/.proagents/dependency-management/compatibility.md +0 -319
- package/.proagents/dependency-management/security-scanning.md +0 -413
- package/.proagents/dependency-management/update-policies.md +0 -374
- package/.proagents/disaster-recovery/README.md +0 -247
- package/.proagents/disaster-recovery/automation.md +0 -366
- package/.proagents/disaster-recovery/backup-recovery.md +0 -571
- package/.proagents/disaster-recovery/incident-response.md +0 -565
- package/.proagents/disaster-recovery/rollback-procedures.md +0 -499
- package/.proagents/disaster-recovery/runbooks.md +0 -603
- package/.proagents/disaster-recovery/scenarios.md +0 -892
- package/.proagents/disaster-recovery/testing.md +0 -438
- package/.proagents/environments/README.md +0 -244
- package/.proagents/environments/configuration.md +0 -437
- package/.proagents/environments/promotion.md +0 -434
- package/.proagents/environments/setup.md +0 -420
- package/.proagents/examples/README.md +0 -55
- package/.proagents/examples/backend-nodejs/README.md +0 -188
- package/.proagents/examples/backend-nodejs/complete-conversation.md +0 -601
- package/.proagents/examples/backend-nodejs/proagents.config.yaml +0 -415
- package/.proagents/examples/backend-nodejs/workflow-example.md +0 -909
- package/.proagents/examples/fullstack-nextjs/README.md +0 -155
- package/.proagents/examples/fullstack-nextjs/complete-conversation.md +0 -604
- package/.proagents/examples/fullstack-nextjs/proagents.config.yaml +0 -287
- package/.proagents/examples/fullstack-nextjs/workflow-example.md +0 -553
- package/.proagents/examples/mobile-react-native/README.md +0 -171
- package/.proagents/examples/mobile-react-native/complete-conversation.md +0 -825
- package/.proagents/examples/mobile-react-native/proagents.config.yaml +0 -330
- package/.proagents/examples/mobile-react-native/workflow-example.md +0 -723
- package/.proagents/examples/web-frontend-react/README.md +0 -125
- package/.proagents/examples/web-frontend-react/complete-conversation.md +0 -556
- package/.proagents/examples/web-frontend-react/proagents.config.yaml +0 -183
- package/.proagents/examples/web-frontend-react/workflow-example.md +0 -603
- package/.proagents/existing-projects/README.md +0 -65
- package/.proagents/existing-projects/challenges.md +0 -861
- package/.proagents/existing-projects/coexistence-mode.md +0 -483
- package/.proagents/existing-projects/compatibility-assessment.md +0 -541
- package/.proagents/existing-projects/gradual-adoption.md +0 -515
- package/.proagents/existing-projects/migration-strategies.md +0 -788
- package/.proagents/existing-projects/pattern-reconciliation.md +0 -489
- package/.proagents/existing-projects/team-onboarding.md +0 -617
- package/.proagents/existing-projects/technical-debt-handling.md +0 -644
- package/.proagents/feature-flags/README.md +0 -263
- package/.proagents/feature-flags/ab-testing.md +0 -413
- package/.proagents/feature-flags/configuration.md +0 -420
- package/.proagents/feature-flags/kill-switches.md +0 -444
- package/.proagents/feature-flags/rollout-strategies.md +0 -392
- package/.proagents/history.log +0 -12
- package/.proagents/i18n/README.md +0 -133
- package/.proagents/i18n/extraction.md +0 -433
- package/.proagents/i18n/tms-integration.md +0 -332
- package/.proagents/i18n/translation-workflow.md +0 -413
- package/.proagents/i18n/validation.md +0 -355
- package/.proagents/logging/README.md +0 -276
- package/.proagents/logging/aggregation.md +0 -475
- package/.proagents/logging/log-levels.md +0 -376
- package/.proagents/logging/sensitive-data.md +0 -423
- package/.proagents/logging/structured-logging.md +0 -406
- package/.proagents/metrics/README.md +0 -69
- package/.proagents/metrics/code-quality-kpis.md +0 -461
- package/.proagents/metrics/deployment-metrics.md +0 -517
- package/.proagents/metrics/developer-productivity.md +0 -368
- package/.proagents/metrics/learning-effectiveness.md +0 -478
- package/.proagents/migrations/README.md +0 -77
- package/.proagents/migrations/from-claude-projects.md +0 -313
- package/.proagents/migrations/from-cursor-rules.md +0 -345
- package/.proagents/migrations/from-custom-workflows.md +0 -410
- package/.proagents/monitoring/README.md +0 -308
- package/.proagents/monitoring/alerting.md +0 -449
- package/.proagents/monitoring/dashboards.md +0 -454
- package/.proagents/monitoring/health-checks.md +0 -436
- package/.proagents/monitoring/metrics.md +0 -434
- package/.proagents/multi-project/README.md +0 -170
- package/.proagents/multi-project/coordinated-deploy.md +0 -510
- package/.proagents/multi-project/cross-project-deps.md +0 -395
- package/.proagents/multi-project/unified-changelog.md +0 -477
- package/.proagents/multi-project/walkthroughs/monorepo-setup.md +0 -787
- package/.proagents/multi-project/workspace-config.md +0 -408
- package/.proagents/notifications/README.md +0 -151
- package/.proagents/notifications/channels.md +0 -457
- package/.proagents/notifications/preferences.md +0 -415
- package/.proagents/notifications/routing.md +0 -449
- package/.proagents/notifications/scheduling.md +0 -425
- package/.proagents/notifications/templates.md +0 -446
- package/.proagents/offline-mode/README.md +0 -145
- package/.proagents/offline-mode/caching.md +0 -344
- package/.proagents/offline-mode/offline-operations.md +0 -312
- package/.proagents/offline-mode/queue-specifications.md +0 -679
- package/.proagents/offline-mode/sync.md +0 -475
- package/.proagents/parallel-features/README.md +0 -85
- package/.proagents/parallel-features/conflict-detection.md +0 -226
- package/.proagents/parallel-features/dependency-management.md +0 -392
- package/.proagents/parallel-features/merge-coordination.md +0 -506
- package/.proagents/parallel-features/tracking-system.md +0 -416
- package/.proagents/performance/README.md +0 -59
- package/.proagents/performance/bundle-analysis.md +0 -375
- package/.proagents/performance/load-testing.md +0 -563
- package/.proagents/performance/runtime-metrics.md +0 -489
- package/.proagents/performance/web-vitals.md +0 -425
- package/.proagents/plugins/README.md +0 -139
- package/.proagents/plugins/creating-plugins.md +0 -504
- package/.proagents/plugins/plugin-api.md +0 -467
- package/.proagents/plugins/plugin-registry.md +0 -276
- package/.proagents/reporting/README.md +0 -158
- package/.proagents/reporting/dashboards.md +0 -366
- package/.proagents/reporting/exports.md +0 -524
- package/.proagents/reporting/quality-metrics.md +0 -385
- package/.proagents/reporting/templates/README.md +0 -56
- package/.proagents/reporting/templates/dashboard-config.json +0 -187
- package/.proagents/reporting/templates/metrics-queries.md +0 -427
- package/.proagents/reporting/templates/react-dashboard.tsx +0 -544
- package/.proagents/reporting/templates/widgets.md +0 -451
- package/.proagents/reporting/velocity-metrics.md +0 -340
- package/.proagents/reverse-engineering/README.md +0 -151
- package/.proagents/reverse-engineering/architecture-extraction.md +0 -325
- package/.proagents/reverse-engineering/code-analysis.md +0 -377
- package/.proagents/reverse-engineering/dependency-mapping.md +0 -567
- package/.proagents/reverse-engineering/diagram-generation.md +0 -586
- package/.proagents/reverse-engineering/documentation-generation.md +0 -468
- package/.proagents/reverse-engineering/pattern-detection.md +0 -569
- package/.proagents/reverse-engineering/quality-assessment.md +0 -733
- package/.proagents/secrets/README.md +0 -278
- package/.proagents/secrets/access-control.md +0 -443
- package/.proagents/secrets/rotation.md +0 -403
- package/.proagents/secrets/scanning.md +0 -487
- package/.proagents/secrets/storage.md +0 -394
- package/.proagents/webhooks/README.md +0 -126
- package/.proagents/webhooks/endpoints.md +0 -298
- package/.proagents/webhooks/events.md +0 -316
- package/.proagents/webhooks/payloads.md +0 -325
- package/.proagents/webhooks/reliability.md +0 -363
- package/.proagents/webhooks/security.md +0 -380
|
@@ -1,504 +0,0 @@
|
|
|
1
|
-
# Creating Plugins
|
|
2
|
-
|
|
3
|
-
Step-by-step guide to building ProAgents plugins.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Quick Start
|
|
8
|
-
|
|
9
|
-
### 1. Create Plugin Scaffold
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
proagents plugin create my-plugin
|
|
13
|
-
cd my-plugin
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
This creates:
|
|
17
|
-
```
|
|
18
|
-
my-plugin/
|
|
19
|
-
├── package.json
|
|
20
|
-
├── tsconfig.json
|
|
21
|
-
├── src/
|
|
22
|
-
│ └── index.ts
|
|
23
|
-
├── tests/
|
|
24
|
-
│ └── index.test.ts
|
|
25
|
-
└── README.md
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### 2. Implement Plugin Logic
|
|
29
|
-
|
|
30
|
-
```typescript
|
|
31
|
-
// src/index.ts
|
|
32
|
-
import { Plugin, PluginContext } from '@proagents/core';
|
|
33
|
-
|
|
34
|
-
export interface MyPluginConfig {
|
|
35
|
-
setting1: string;
|
|
36
|
-
setting2: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export default class MyPlugin implements Plugin<MyPluginConfig> {
|
|
40
|
-
name = 'my-plugin';
|
|
41
|
-
version = '1.0.0';
|
|
42
|
-
|
|
43
|
-
async initialize(context: PluginContext, config: MyPluginConfig) {
|
|
44
|
-
// Setup plugin
|
|
45
|
-
context.logger.info('My plugin initialized!');
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async destroy() {
|
|
49
|
-
// Cleanup
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 3. Build and Test
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
npm run build
|
|
58
|
-
npm test
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### 4. Install Locally
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
proagents plugin install ./my-plugin
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## Plugin Templates
|
|
70
|
-
|
|
71
|
-
### Integration Plugin
|
|
72
|
-
|
|
73
|
-
Connects ProAgents with external services.
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
import { Plugin, PluginContext, HookPayload } from '@proagents/core';
|
|
77
|
-
|
|
78
|
-
interface JiraPluginConfig {
|
|
79
|
-
baseUrl: string;
|
|
80
|
-
apiToken: string;
|
|
81
|
-
projectKey: string;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export default class JiraPlugin implements Plugin<JiraPluginConfig> {
|
|
85
|
-
name = 'jira-plugin';
|
|
86
|
-
version = '1.0.0';
|
|
87
|
-
|
|
88
|
-
private context: PluginContext;
|
|
89
|
-
private config: JiraPluginConfig;
|
|
90
|
-
private client: JiraClient;
|
|
91
|
-
|
|
92
|
-
async initialize(context: PluginContext, config: JiraPluginConfig) {
|
|
93
|
-
this.context = context;
|
|
94
|
-
this.config = config;
|
|
95
|
-
|
|
96
|
-
// Initialize Jira client
|
|
97
|
-
this.client = new JiraClient({
|
|
98
|
-
baseUrl: config.baseUrl,
|
|
99
|
-
token: config.apiToken,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// Register hooks
|
|
103
|
-
context.hooks.on('onFeatureStart', this.createTicket.bind(this));
|
|
104
|
-
context.hooks.on('onFeatureComplete', this.closeTicket.bind(this));
|
|
105
|
-
|
|
106
|
-
// Register commands
|
|
107
|
-
context.commands.register({
|
|
108
|
-
name: 'jira-link',
|
|
109
|
-
description: 'Link current feature to Jira ticket',
|
|
110
|
-
handler: this.linkTicket.bind(this),
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async createTicket(payload: HookPayload<'onFeatureStart'>) {
|
|
115
|
-
const { feature } = payload;
|
|
116
|
-
|
|
117
|
-
try {
|
|
118
|
-
const ticket = await this.client.createIssue({
|
|
119
|
-
project: this.config.projectKey,
|
|
120
|
-
summary: feature.name,
|
|
121
|
-
description: feature.description,
|
|
122
|
-
issueType: 'Story',
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
// Store ticket reference
|
|
126
|
-
await this.context.cache.set(
|
|
127
|
-
`jira:${feature.id}`,
|
|
128
|
-
ticket.key
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
this.context.logger.info(`Created Jira ticket: ${ticket.key}`);
|
|
132
|
-
} catch (error) {
|
|
133
|
-
this.context.logger.error('Failed to create Jira ticket', { error });
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
async closeTicket(payload: HookPayload<'onFeatureComplete'>) {
|
|
138
|
-
const { feature, result } = payload;
|
|
139
|
-
|
|
140
|
-
const ticketKey = await this.context.cache.get(`jira:${feature.id}`);
|
|
141
|
-
if (!ticketKey) return;
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
await this.client.transitionIssue(ticketKey, 'Done');
|
|
145
|
-
this.context.logger.info(`Closed Jira ticket: ${ticketKey}`);
|
|
146
|
-
} catch (error) {
|
|
147
|
-
this.context.logger.error('Failed to close Jira ticket', { error });
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async linkTicket(args: string[]) {
|
|
152
|
-
const [ticketKey] = args;
|
|
153
|
-
// Implementation
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
async destroy() {
|
|
157
|
-
// Cleanup
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
### Generator Plugin
|
|
165
|
-
|
|
166
|
-
Adds custom code generation capabilities.
|
|
167
|
-
|
|
168
|
-
```typescript
|
|
169
|
-
import { Plugin, PluginContext, Generator } from '@proagents/core';
|
|
170
|
-
|
|
171
|
-
interface GeneratorPluginConfig {
|
|
172
|
-
templatesDir: string;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export default class CustomGeneratorPlugin implements Plugin<GeneratorPluginConfig> {
|
|
176
|
-
name = 'custom-generator';
|
|
177
|
-
version = '1.0.0';
|
|
178
|
-
|
|
179
|
-
async initialize(context: PluginContext, config: GeneratorPluginConfig) {
|
|
180
|
-
// Register custom generator
|
|
181
|
-
context.generators.register({
|
|
182
|
-
name: 'my-component',
|
|
183
|
-
description: 'Generate custom component',
|
|
184
|
-
generator: new MyComponentGenerator(config.templatesDir),
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
// Register command
|
|
188
|
-
context.commands.registerSlash({
|
|
189
|
-
name: '/generate-component',
|
|
190
|
-
description: 'Generate a custom component',
|
|
191
|
-
handler: this.handleGenerate.bind(this),
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
async handleGenerate(input: string) {
|
|
196
|
-
const generator = this.context.generators.get('my-component');
|
|
197
|
-
const result = await generator.generate({ name: input });
|
|
198
|
-
|
|
199
|
-
return {
|
|
200
|
-
success: true,
|
|
201
|
-
files: result.files,
|
|
202
|
-
message: `Generated component: ${input}`,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
async destroy() {}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
class MyComponentGenerator implements Generator {
|
|
210
|
-
constructor(private templatesDir: string) {}
|
|
211
|
-
|
|
212
|
-
async generate(options: { name: string }) {
|
|
213
|
-
const files = [
|
|
214
|
-
{
|
|
215
|
-
path: `src/components/${options.name}/${options.name}.tsx`,
|
|
216
|
-
content: this.generateComponent(options.name),
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
path: `src/components/${options.name}/${options.name}.test.tsx`,
|
|
220
|
-
content: this.generateTest(options.name),
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
path: `src/components/${options.name}/index.ts`,
|
|
224
|
-
content: `export * from './${options.name}';`,
|
|
225
|
-
},
|
|
226
|
-
];
|
|
227
|
-
|
|
228
|
-
return { files };
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
private generateComponent(name: string): string {
|
|
232
|
-
return `
|
|
233
|
-
import React from 'react';
|
|
234
|
-
|
|
235
|
-
export interface ${name}Props {
|
|
236
|
-
// Props
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export function ${name}({}: ${name}Props) {
|
|
240
|
-
return <div data-testid="${name.toLowerCase()}">${name}</div>;
|
|
241
|
-
}
|
|
242
|
-
`.trim();
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
private generateTest(name: string): string {
|
|
246
|
-
return `
|
|
247
|
-
import { render, screen } from '@testing-library/react';
|
|
248
|
-
import { ${name} } from './${name}';
|
|
249
|
-
|
|
250
|
-
describe('${name}', () => {
|
|
251
|
-
it('should render', () => {
|
|
252
|
-
render(<${name} />);
|
|
253
|
-
expect(screen.getByTestId('${name.toLowerCase()}')).toBeInTheDocument();
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
`.trim();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
### Validator Plugin
|
|
264
|
-
|
|
265
|
-
Adds custom validation rules.
|
|
266
|
-
|
|
267
|
-
```typescript
|
|
268
|
-
import { Plugin, PluginContext, Validator, ValidationResult } from '@proagents/core';
|
|
269
|
-
|
|
270
|
-
interface ValidatorPluginConfig {
|
|
271
|
-
rules: string[];
|
|
272
|
-
severity: 'error' | 'warning';
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
export default class CustomValidatorPlugin implements Plugin<ValidatorPluginConfig> {
|
|
276
|
-
name = 'custom-validator';
|
|
277
|
-
version = '1.0.0';
|
|
278
|
-
|
|
279
|
-
async initialize(context: PluginContext, config: ValidatorPluginConfig) {
|
|
280
|
-
// Register validators
|
|
281
|
-
context.validators.register({
|
|
282
|
-
name: 'no-console-log',
|
|
283
|
-
description: 'Disallow console.log statements',
|
|
284
|
-
validator: new NoConsoleLogValidator(config.severity),
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
context.validators.register({
|
|
288
|
-
name: 'require-jsdoc',
|
|
289
|
-
description: 'Require JSDoc for public functions',
|
|
290
|
-
validator: new RequireJSDocValidator(config.severity),
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
// Hook into code review phase
|
|
294
|
-
context.hooks.on('onPhaseStart', async ({ phase }) => {
|
|
295
|
-
if (phase === 'review') {
|
|
296
|
-
const results = await context.validators.runAll();
|
|
297
|
-
this.reportResults(context, results);
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
private reportResults(context: PluginContext, results: ValidationResult[]) {
|
|
303
|
-
for (const result of results) {
|
|
304
|
-
if (result.severity === 'error') {
|
|
305
|
-
context.ui.error(`${result.file}:${result.line} - ${result.message}`);
|
|
306
|
-
} else {
|
|
307
|
-
context.ui.warn(`${result.file}:${result.line} - ${result.message}`);
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
async destroy() {}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
class NoConsoleLogValidator implements Validator {
|
|
316
|
-
constructor(private severity: 'error' | 'warning') {}
|
|
317
|
-
|
|
318
|
-
async validate(files: string[]): Promise<ValidationResult[]> {
|
|
319
|
-
const results: ValidationResult[] = [];
|
|
320
|
-
|
|
321
|
-
for (const file of files) {
|
|
322
|
-
const content = await fs.readFile(file, 'utf-8');
|
|
323
|
-
const lines = content.split('\n');
|
|
324
|
-
|
|
325
|
-
lines.forEach((line, index) => {
|
|
326
|
-
if (line.includes('console.log')) {
|
|
327
|
-
results.push({
|
|
328
|
-
file,
|
|
329
|
-
line: index + 1,
|
|
330
|
-
message: 'Unexpected console.log statement',
|
|
331
|
-
severity: this.severity,
|
|
332
|
-
rule: 'no-console-log',
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
return results;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
---
|
|
344
|
-
|
|
345
|
-
## Configuration Schema
|
|
346
|
-
|
|
347
|
-
Define your plugin's configuration schema:
|
|
348
|
-
|
|
349
|
-
```typescript
|
|
350
|
-
// src/config.ts
|
|
351
|
-
import { z } from 'zod';
|
|
352
|
-
|
|
353
|
-
export const configSchema = z.object({
|
|
354
|
-
apiKey: z.string().min(1, 'API key is required'),
|
|
355
|
-
baseUrl: z.string().url('Must be a valid URL'),
|
|
356
|
-
timeout: z.number().positive().default(30000),
|
|
357
|
-
retries: z.number().int().min(0).max(10).default(3),
|
|
358
|
-
features: z.object({
|
|
359
|
-
autoSync: z.boolean().default(true),
|
|
360
|
-
notifications: z.boolean().default(true),
|
|
361
|
-
}).default({}),
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
export type PluginConfig = z.infer<typeof configSchema>;
|
|
365
|
-
|
|
366
|
-
// In plugin
|
|
367
|
-
async initialize(context: PluginContext, rawConfig: unknown) {
|
|
368
|
-
const config = configSchema.parse(rawConfig);
|
|
369
|
-
// Use validated config
|
|
370
|
-
}
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
---
|
|
374
|
-
|
|
375
|
-
## Testing
|
|
376
|
-
|
|
377
|
-
### Unit Tests
|
|
378
|
-
|
|
379
|
-
```typescript
|
|
380
|
-
import { createTestContext, createMockFeature } from '@proagents/testing';
|
|
381
|
-
import MyPlugin from '../src';
|
|
382
|
-
|
|
383
|
-
describe('MyPlugin', () => {
|
|
384
|
-
let plugin: MyPlugin;
|
|
385
|
-
let context: TestPluginContext;
|
|
386
|
-
|
|
387
|
-
beforeEach(async () => {
|
|
388
|
-
context = createTestContext();
|
|
389
|
-
plugin = new MyPlugin();
|
|
390
|
-
|
|
391
|
-
await plugin.initialize(context, {
|
|
392
|
-
apiKey: 'test-key',
|
|
393
|
-
baseUrl: 'https://api.test.com',
|
|
394
|
-
});
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
afterEach(async () => {
|
|
398
|
-
await plugin.destroy();
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
describe('onFeatureStart', () => {
|
|
402
|
-
it('should create external ticket', async () => {
|
|
403
|
-
const feature = createMockFeature({ name: 'Test Feature' });
|
|
404
|
-
|
|
405
|
-
await context.hooks.emit('onFeatureStart', { feature });
|
|
406
|
-
|
|
407
|
-
expect(context.http.post).toHaveBeenCalledWith(
|
|
408
|
-
expect.stringContaining('/tickets'),
|
|
409
|
-
expect.objectContaining({ title: 'Test Feature' })
|
|
410
|
-
);
|
|
411
|
-
});
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
describe('commands', () => {
|
|
415
|
-
it('should register custom command', () => {
|
|
416
|
-
expect(context.commands.has('my-command')).toBe(true);
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
it('should execute command', async () => {
|
|
420
|
-
const result = await context.commands.execute('my-command', ['arg1']);
|
|
421
|
-
|
|
422
|
-
expect(result.success).toBe(true);
|
|
423
|
-
});
|
|
424
|
-
});
|
|
425
|
-
});
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
### Integration Tests
|
|
429
|
-
|
|
430
|
-
```typescript
|
|
431
|
-
import { createIntegrationContext } from '@proagents/testing';
|
|
432
|
-
import MyPlugin from '../src';
|
|
433
|
-
|
|
434
|
-
describe('MyPlugin Integration', () => {
|
|
435
|
-
it('should work with real API', async () => {
|
|
436
|
-
const context = await createIntegrationContext({
|
|
437
|
-
project: './fixtures/test-project',
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
const plugin = new MyPlugin();
|
|
441
|
-
await plugin.initialize(context, {
|
|
442
|
-
apiKey: process.env.TEST_API_KEY,
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
// Test real integration
|
|
446
|
-
});
|
|
447
|
-
});
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
---
|
|
451
|
-
|
|
452
|
-
## Publishing
|
|
453
|
-
|
|
454
|
-
### 1. Prepare Package
|
|
455
|
-
|
|
456
|
-
```json
|
|
457
|
-
{
|
|
458
|
-
"name": "@myorg/proagents-plugin-example",
|
|
459
|
-
"version": "1.0.0",
|
|
460
|
-
"description": "Example ProAgents plugin",
|
|
461
|
-
"main": "dist/index.js",
|
|
462
|
-
"types": "dist/index.d.ts",
|
|
463
|
-
"files": [
|
|
464
|
-
"dist",
|
|
465
|
-
"README.md"
|
|
466
|
-
],
|
|
467
|
-
"keywords": [
|
|
468
|
-
"proagents",
|
|
469
|
-
"proagents-plugin"
|
|
470
|
-
],
|
|
471
|
-
"peerDependencies": {
|
|
472
|
-
"@proagents/core": ">=1.0.0"
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
### 2. Build
|
|
478
|
-
|
|
479
|
-
```bash
|
|
480
|
-
npm run build
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
### 3. Publish
|
|
484
|
-
|
|
485
|
-
```bash
|
|
486
|
-
npm publish --access public
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
### 4. Register (Optional)
|
|
490
|
-
|
|
491
|
-
Submit to the ProAgents plugin registry for discoverability.
|
|
492
|
-
|
|
493
|
-
---
|
|
494
|
-
|
|
495
|
-
## Best Practices
|
|
496
|
-
|
|
497
|
-
1. **Single Responsibility**: Each plugin should do one thing well
|
|
498
|
-
2. **Configuration Validation**: Always validate configuration
|
|
499
|
-
3. **Error Handling**: Handle errors gracefully, don't crash the host
|
|
500
|
-
4. **Logging**: Use context.logger for all output
|
|
501
|
-
5. **Cleanup**: Implement destroy() to clean up resources
|
|
502
|
-
6. **Testing**: Include comprehensive tests
|
|
503
|
-
7. **Documentation**: Provide clear usage documentation
|
|
504
|
-
8. **Versioning**: Follow semantic versioning
|