@ai-sdlc/orchestrator 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/action-enforcement.d.ts +26 -0
  2. package/dist/action-enforcement.js +70 -0
  3. package/dist/admission-score.d.ts +58 -0
  4. package/dist/admission-score.js +164 -0
  5. package/dist/cycle-utils.d.ts +51 -0
  6. package/dist/cycle-utils.js +77 -0
  7. package/dist/defaults.d.ts +5 -0
  8. package/dist/defaults.js +5 -0
  9. package/dist/execute.js +121 -26
  10. package/dist/fix-ci.js +32 -2
  11. package/dist/fix-review.d.ts +66 -0
  12. package/dist/fix-review.js +441 -0
  13. package/dist/index.d.ts +10 -2
  14. package/dist/index.js +13 -1
  15. package/dist/pipeline-cycle-detector.d.ts +70 -0
  16. package/dist/pipeline-cycle-detector.js +111 -0
  17. package/dist/priority.d.ts +2 -76
  18. package/dist/review.d.ts +31 -0
  19. package/dist/review.js +74 -0
  20. package/dist/runners/claude-code.js +314 -32
  21. package/dist/runners/index.d.ts +2 -1
  22. package/dist/runners/index.js +1 -0
  23. package/dist/runners/review-agent.d.ts +47 -0
  24. package/dist/runners/review-agent.js +220 -0
  25. package/dist/runners/security-triage.js +4 -0
  26. package/dist/runners/types.d.ts +19 -0
  27. package/dist/state/index.d.ts +1 -1
  28. package/dist/state/schema.d.ts +2 -1
  29. package/dist/state/schema.js +54 -1
  30. package/dist/state/store.d.ts +17 -1
  31. package/dist/state/store.js +122 -0
  32. package/dist/state/types.d.ts +35 -0
  33. package/dist/workflow-patterns/artifact-writer.d.ts +16 -0
  34. package/dist/workflow-patterns/artifact-writer.js +34 -0
  35. package/dist/workflow-patterns/classifiers.d.ts +10 -0
  36. package/dist/workflow-patterns/classifiers.js +72 -0
  37. package/dist/workflow-patterns/detector.d.ts +27 -0
  38. package/dist/workflow-patterns/detector.js +186 -0
  39. package/dist/workflow-patterns/index.d.ts +8 -0
  40. package/dist/workflow-patterns/index.js +7 -0
  41. package/dist/workflow-patterns/proposal-generator.d.ts +15 -0
  42. package/dist/workflow-patterns/proposal-generator.js +183 -0
  43. package/dist/workflow-patterns/telemetry-ingest.d.ts +27 -0
  44. package/dist/workflow-patterns/telemetry-ingest.js +103 -0
  45. package/dist/workflow-patterns/types.d.ts +61 -0
  46. package/dist/workflow-patterns/types.js +11 -0
  47. package/package.json +2 -2
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Action enforcement — checks shell commands against blockedActions
3
+ * patterns from AgentRole constraints. Prevents agents from executing
4
+ * dangerous operations like merging PRs, force-pushing, or dismissing reviews.
5
+ */
6
+ import type { AuditLog } from '@ai-sdlc/reference';
7
+ export interface ActionEnforcementResult {
8
+ allowed: boolean;
9
+ /** The pattern that matched, if blocked. */
10
+ matchedPattern?: string;
11
+ /** The full command that was checked. */
12
+ command: string;
13
+ }
14
+ /**
15
+ * Check if a shell command is allowed by the blocked actions policy.
16
+ */
17
+ export declare function checkAction(command: string, blockedActions: string[]): ActionEnforcementResult;
18
+ /**
19
+ * Check an action and record the result in the audit log if blocked.
20
+ */
21
+ export declare function enforceAction(command: string, blockedActions: string[], auditLog?: AuditLog, agentName?: string): ActionEnforcementResult;
22
+ /**
23
+ * Default blocked actions for all agents.
24
+ */
25
+ export declare const DEFAULT_BLOCKED_ACTIONS: string[];
26
+ //# sourceMappingURL=action-enforcement.d.ts.map
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Action enforcement — checks shell commands against blockedActions
3
+ * patterns from AgentRole constraints. Prevents agents from executing
4
+ * dangerous operations like merging PRs, force-pushing, or dismissing reviews.
5
+ */
6
+ /**
7
+ * Convert a glob-like blocked action pattern to a regex.
8
+ * Supports * (any characters) anywhere in the pattern.
9
+ */
10
+ function patternToRegex(pattern) {
11
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
12
+ const regexStr = escaped.replace(/\*/g, '.*');
13
+ return new RegExp(`^${regexStr}$`, 'i');
14
+ }
15
+ /**
16
+ * Check if a shell command is allowed by the blocked actions policy.
17
+ */
18
+ export function checkAction(command, blockedActions) {
19
+ const trimmed = command.trim();
20
+ if (!trimmed)
21
+ return { allowed: true, command: trimmed };
22
+ for (const pattern of blockedActions) {
23
+ const regex = patternToRegex(pattern);
24
+ if (regex.test(trimmed)) {
25
+ return {
26
+ allowed: false,
27
+ matchedPattern: pattern,
28
+ command: trimmed,
29
+ };
30
+ }
31
+ }
32
+ return { allowed: true, command: trimmed };
33
+ }
34
+ /**
35
+ * Check an action and record the result in the audit log if blocked.
36
+ */
37
+ export function enforceAction(command, blockedActions, auditLog, agentName) {
38
+ const result = checkAction(command, blockedActions);
39
+ if (!result.allowed && auditLog) {
40
+ auditLog.record({
41
+ actor: agentName ?? 'agent',
42
+ action: 'execute',
43
+ resource: `command/${result.command.slice(0, 100)}`,
44
+ decision: 'denied',
45
+ details: {
46
+ reason: 'blocked-action',
47
+ pattern: result.matchedPattern,
48
+ command: result.command,
49
+ },
50
+ });
51
+ }
52
+ return result;
53
+ }
54
+ /**
55
+ * Default blocked actions for all agents.
56
+ */
57
+ export const DEFAULT_BLOCKED_ACTIONS = [
58
+ 'gh pr merge*',
59
+ 'git merge*',
60
+ 'git push --force*',
61
+ 'git push -f*',
62
+ 'gh pr close*',
63
+ 'gh issue close*',
64
+ 'git branch -D*',
65
+ 'git branch -d*',
66
+ 'git reset --hard*',
67
+ 'git checkout -- .',
68
+ 'git restore .',
69
+ ];
70
+ //# sourceMappingURL=action-enforcement.js.map
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Issue admission scoring — maps GitHub issue fields to PPA dimensions
3
+ * and determines whether an issue should enter the pipeline.
4
+ *
5
+ * Extracted from dogfood/scripts/ppa-score.ts for reuse across CLI
6
+ * scripts and workflows.
7
+ */
8
+ import { type PriorityInput, type PriorityScore, type PriorityConfig } from './priority.js';
9
+ /**
10
+ * GitHub author_association values indicating trust level.
11
+ * OWNER/MEMBER/COLLABORATOR = trusted (project team)
12
+ * CONTRIBUTOR = semi-trusted (has had PRs merged)
13
+ * NONE = untrusted (external)
14
+ */
15
+ export type AuthorAssociation = 'OWNER' | 'MEMBER' | 'COLLABORATOR' | 'CONTRIBUTOR' | 'FIRST_TIMER' | 'FIRST_TIME_CONTRIBUTOR' | 'NONE';
16
+ export interface AdmissionInput {
17
+ issueNumber: number;
18
+ title: string;
19
+ body: string;
20
+ labels: string[];
21
+ /** Total thumbsUp + heart reactions. */
22
+ reactionCount: number;
23
+ /** Number of human comments. */
24
+ commentCount: number;
25
+ /** ISO timestamp of issue creation. */
26
+ createdAt: string;
27
+ /** GitHub author_association — determines trust-based signal boosting. */
28
+ authorAssociation?: AuthorAssociation;
29
+ }
30
+ export interface AdmissionThresholds {
31
+ minimumScore: number;
32
+ minimumConfidence: number;
33
+ }
34
+ export interface IssueAdmissionResult {
35
+ admitted: boolean;
36
+ score: PriorityScore;
37
+ reason: string;
38
+ suggestions?: string[];
39
+ }
40
+ /**
41
+ * Map GitHub issue fields to PPA PriorityInput dimensions.
42
+ *
43
+ * Heuristics (ported from dogfood/scripts/ppa-score.ts):
44
+ * - Labels → bug severity, soul alignment hints, builder conviction
45
+ * - Reactions → team consensus, customer request count
46
+ * - Comments → demand signal
47
+ * - Body complexity section → complexity score
48
+ * - Issue age → competitive drift
49
+ */
50
+ export declare function mapIssueToPriorityInput(input: AdmissionInput): PriorityInput;
51
+ /**
52
+ * Score a GitHub issue for pipeline admission using the Product Priority Algorithm.
53
+ *
54
+ * Returns whether the issue is admitted (score and confidence above thresholds)
55
+ * along with the full score and, if rejected, suggestions for improvement.
56
+ */
57
+ export declare function scoreIssueForAdmission(input: AdmissionInput, thresholds: AdmissionThresholds, priorityConfig?: PriorityConfig): IssueAdmissionResult;
58
+ //# sourceMappingURL=admission-score.d.ts.map
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Issue admission scoring — maps GitHub issue fields to PPA dimensions
3
+ * and determines whether an issue should enter the pipeline.
4
+ *
5
+ * Extracted from dogfood/scripts/ppa-score.ts for reuse across CLI
6
+ * scripts and workflows.
7
+ */
8
+ import { computePriority, } from './priority.js';
9
+ // ── Mapping ──────────────────────────────────────────────────────────
10
+ /**
11
+ * Map GitHub issue fields to PPA PriorityInput dimensions.
12
+ *
13
+ * Heuristics (ported from dogfood/scripts/ppa-score.ts):
14
+ * - Labels → bug severity, soul alignment hints, builder conviction
15
+ * - Reactions → team consensus, customer request count
16
+ * - Comments → demand signal
17
+ * - Body complexity section → complexity score
18
+ * - Issue age → competitive drift
19
+ */
20
+ export function mapIssueToPriorityInput(input) {
21
+ const labels = input.labels;
22
+ const assoc = input.authorAssociation ?? 'NONE';
23
+ // ── Trust-based signal boosting ────────────────────────────────
24
+ // Trusted sources (project team) get baseline conviction and demand.
25
+ // Untrusted sources need external validation (reactions, comments).
26
+ const isTrusted = assoc === 'OWNER' || assoc === 'MEMBER' || assoc === 'COLLABORATOR';
27
+ const isContributor = assoc === 'CONTRIBUTOR';
28
+ // ── Complexity from issue body ───────────────────────────────
29
+ const complexityMatch = input.body?.match(/###?\s*Complexity\s*\n+\s*(\d+)/i);
30
+ const complexity = complexityMatch ? Number(complexityMatch[1]) : undefined;
31
+ // ── Bug severity from labels ─────────────────────────────────
32
+ let bugSeverity;
33
+ if (labels.includes('critical') || labels.includes('P0'))
34
+ bugSeverity = 5;
35
+ else if (labels.includes('bug'))
36
+ bugSeverity = 3;
37
+ // ── Soul alignment heuristic from labels ─────────────────────
38
+ let soulAlignment = 0.5;
39
+ if (labels.includes('security') || labels.includes('security-triage'))
40
+ soulAlignment = 0.7;
41
+ if (labels.includes('enhancement'))
42
+ soulAlignment = 0.6;
43
+ if (labels.includes('governance') || labels.includes('compliance'))
44
+ soulAlignment = 0.85;
45
+ if (labels.includes('spec') || labels.includes('rfc'))
46
+ soulAlignment = 0.9;
47
+ // Trusted authors get a soul alignment floor — they know the project mission
48
+ if (isTrusted && soulAlignment < 0.6)
49
+ soulAlignment = 0.6;
50
+ // ── Reactions → demand / consensus ───────────────────────────
51
+ const reactionConsensus = Math.min(1, input.reactionCount / 5);
52
+ // Trusted sources carry implicit team consensus
53
+ const teamConsensus = isTrusted ? Math.max(0.5, reactionConsensus) : reactionConsensus;
54
+ // ── Comment count → demand signal ────────────────────────────
55
+ const commentDemand = Math.min(1, input.commentCount / 5);
56
+ // Trusted sources filing an issue IS demand — they wouldn't file it otherwise
57
+ const demandSignal = isTrusted
58
+ ? Math.max(0.4, commentDemand)
59
+ : isContributor
60
+ ? Math.max(0.2, commentDemand)
61
+ : commentDemand;
62
+ // ── Builder conviction ─────────────────────────────────────────
63
+ // Trusted: high conviction (they're the builders)
64
+ // Contributor: moderate (proven track record)
65
+ // ai-eligible label: explicit signal
66
+ // Default: low (needs validation)
67
+ const builderConviction = labels.includes('ai-eligible')
68
+ ? 0.8
69
+ : isTrusted
70
+ ? 0.8
71
+ : isContributor
72
+ ? 0.6
73
+ : 0.4;
74
+ // ── Age → competitive drift ──────────────────────────────────
75
+ const ageMs = Date.now() - new Date(input.createdAt).getTime();
76
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
77
+ const competitiveDrift = Math.min(1, Math.max(0, (ageDays - 30) / 180));
78
+ // ── Security-rejected veto ───────────────────────────────────
79
+ if (labels.includes('security-rejected')) {
80
+ return {
81
+ itemId: `#${input.issueNumber}`,
82
+ title: input.title,
83
+ description: input.body ?? '',
84
+ labels,
85
+ soulAlignment: 0, // veto
86
+ };
87
+ }
88
+ return {
89
+ itemId: `#${input.issueNumber}`,
90
+ title: input.title,
91
+ description: input.body ?? '',
92
+ labels,
93
+ soulAlignment,
94
+ bugSeverity,
95
+ customerRequestCount: input.reactionCount,
96
+ demandSignal,
97
+ builderConviction,
98
+ complexity,
99
+ competitiveDrift,
100
+ teamConsensus,
101
+ explicitPriority: labels.includes('high') ? 0.8 : labels.includes('low') ? 0.2 : undefined,
102
+ };
103
+ }
104
+ // ── Suggestions ──────────────────────────────────────────────────────
105
+ function generateSuggestions(input, score) {
106
+ const suggestions = [];
107
+ const d = score.dimensions;
108
+ if (score.confidence < 0.2) {
109
+ suggestions.push('Add more detail to improve scoring confidence (complexity, acceptance criteria, labels)');
110
+ }
111
+ if (!input.body?.match(/###?\s*Complexity\s*\n/i)) {
112
+ suggestions.push('Add a `### Complexity` section with a score from 1-10');
113
+ }
114
+ if (!input.body?.match(/###?\s*Acceptance Criteria/i)) {
115
+ suggestions.push('Add an `### Acceptance Criteria` section with testable criteria');
116
+ }
117
+ if (input.body.length < 50) {
118
+ suggestions.push('Provide a more detailed description of the problem or feature');
119
+ }
120
+ const assoc = input.authorAssociation ?? 'NONE';
121
+ const isTrusted = assoc === 'OWNER' || assoc === 'MEMBER' || assoc === 'COLLABORATOR';
122
+ if (d.demandPressure < 0.3 && !isTrusted) {
123
+ suggestions.push('Low demand signal — add reactions or comments to show interest');
124
+ }
125
+ if (d.soulAlignment < 0.5) {
126
+ suggestions.push('Add labels that indicate alignment with the project mission (e.g., governance, spec, security)');
127
+ }
128
+ return suggestions;
129
+ }
130
+ // ── Public API ───────────────────────────────────────────────────────
131
+ /**
132
+ * Score a GitHub issue for pipeline admission using the Product Priority Algorithm.
133
+ *
134
+ * Returns whether the issue is admitted (score and confidence above thresholds)
135
+ * along with the full score and, if rejected, suggestions for improvement.
136
+ */
137
+ export function scoreIssueForAdmission(input, thresholds, priorityConfig) {
138
+ const priorityInput = mapIssueToPriorityInput(input);
139
+ const score = computePriority(priorityInput, priorityConfig);
140
+ const scorePasses = score.composite >= thresholds.minimumScore;
141
+ const confidencePasses = score.confidence >= thresholds.minimumConfidence;
142
+ const admitted = scorePasses && confidencePasses;
143
+ if (admitted) {
144
+ return {
145
+ admitted: true,
146
+ score,
147
+ reason: `Score ${score.composite.toFixed(4)} meets threshold ${thresholds.minimumScore} with ${(score.confidence * 100).toFixed(0)}% confidence`,
148
+ };
149
+ }
150
+ const reasons = [];
151
+ if (!scorePasses) {
152
+ reasons.push(`score ${score.composite.toFixed(4)} below minimum ${thresholds.minimumScore}`);
153
+ }
154
+ if (!confidencePasses) {
155
+ reasons.push(`confidence ${(score.confidence * 100).toFixed(0)}% below minimum ${(thresholds.minimumConfidence * 100).toFixed(0)}%`);
156
+ }
157
+ return {
158
+ admitted: false,
159
+ score,
160
+ reason: `Not admitted: ${reasons.join('; ')}`,
161
+ suggestions: generateSuggestions(input, score),
162
+ };
163
+ }
164
+ //# sourceMappingURL=admission-score.js.map
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Utility functions for cycle detection and handling.
3
+ */
4
+ import type { IssueTracker } from '@ai-sdlc/reference';
5
+ import { PipelineCycleDetector, type PipelineStage } from './pipeline-cycle-detector.js';
6
+ export interface CycleHandlerOptions {
7
+ /** Issue or PR identifier. */
8
+ issueOrPrId: string;
9
+ /** Stage being invoked. */
10
+ stage: PipelineStage;
11
+ /** Issue tracker for fetching/posting comments. */
12
+ tracker: IssueTracker;
13
+ /** Cycle detector instance. */
14
+ detector: PipelineCycleDetector;
15
+ /** Optional Slack notification callback. */
16
+ notifySlack?: (message: string) => Promise<void>;
17
+ /** Custom cycle notification template (optional). */
18
+ cycleTemplate?: {
19
+ title: string;
20
+ body: string;
21
+ };
22
+ }
23
+ export interface CycleCheckResult {
24
+ /** Whether a cycle was detected. */
25
+ cycleDetected: boolean;
26
+ /** Marker to append to comments for tracking. */
27
+ marker: string;
28
+ /** Formatted message describing the cycle (if detected). */
29
+ cycleMessage?: string;
30
+ }
31
+ /**
32
+ * Check for pipeline cycles and post notification if detected.
33
+ *
34
+ * The marker is generated upfront so the caller can append it to comments
35
+ * BEFORE executing the stage (records intent, prevents race conditions).
36
+ * Cycle detection accounts for the pending invocation (+1 to current count).
37
+ */
38
+ export declare function checkAndHandleCycle(options: CycleHandlerOptions): Promise<CycleCheckResult>;
39
+ /**
40
+ * Create a cycle detector from pipeline config.
41
+ * Reads maxRetries from stage configurations.
42
+ */
43
+ export declare function createCycleDetectorFromConfig(config: {
44
+ stages?: Array<{
45
+ name: string;
46
+ onFailure?: {
47
+ maxRetries?: number;
48
+ };
49
+ }>;
50
+ }): PipelineCycleDetector;
51
+ //# sourceMappingURL=cycle-utils.d.ts.map
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Utility functions for cycle detection and handling.
3
+ */
4
+ import { PipelineCycleDetector } from './pipeline-cycle-detector.js';
5
+ import { NOTIFICATION_TITLES } from './defaults.js';
6
+ /**
7
+ * Sanitize template content to prevent markdown/HTML injection.
8
+ * Strips HTML tags and limits length.
9
+ */
10
+ function sanitizeTemplate(text) {
11
+ return text.replace(/<[^>]*>/g, '').slice(0, 2000);
12
+ }
13
+ /**
14
+ * Check for pipeline cycles and post notification if detected.
15
+ *
16
+ * The marker is generated upfront so the caller can append it to comments
17
+ * BEFORE executing the stage (records intent, prevents race conditions).
18
+ * Cycle detection accounts for the pending invocation (+1 to current count).
19
+ */
20
+ export async function checkAndHandleCycle(options) {
21
+ const { issueOrPrId, stage, tracker, detector, notifySlack, cycleTemplate } = options;
22
+ // Detect cycles from existing comment markers (no +1 — marker is separate)
23
+ const cycleResult = await detector.detectCycle(tracker, issueOrPrId);
24
+ // Generate marker for the caller to append to comments
25
+ const marker = detector.recordInvocation(stage);
26
+ if (cycleResult.cycleDetected) {
27
+ const loopingSummary = cycleResult.loopingStages
28
+ .map((s) => `- **${s.stage}**: ${s.count}/${s.max} invocations`)
29
+ .join('\n');
30
+ const title = sanitizeTemplate(cycleTemplate?.title ?? NOTIFICATION_TITLES.pipelineCycleDetected);
31
+ const body = sanitizeTemplate(cycleTemplate?.body ??
32
+ `The pipeline has detected an infinite loop across the following stages:\n\n${loopingSummary}\n\n**Manual intervention is required** to resolve the cycle. Please review the issue and PR to determine the root cause.`);
33
+ const cycleMessage = `## ${title}\n\n${body}`;
34
+ // Post cycle detection comment
35
+ await tracker.addComment(issueOrPrId, cycleMessage);
36
+ // Send Slack notification if configured
37
+ if (notifySlack) {
38
+ const slackMessage = `:warning: *Pipeline Cycle Detected* for #${issueOrPrId}\n\nLooping stages:\n${cycleResult.loopingStages.map((s) => `• ${s.stage}: ${s.count}/${s.max}`).join('\n')}`;
39
+ await notifySlack(slackMessage).catch((err) => {
40
+ console.error('[cycle-detector] Slack notification failed:', err instanceof Error ? err.message : String(err));
41
+ });
42
+ }
43
+ return { cycleDetected: true, marker, cycleMessage };
44
+ }
45
+ return { cycleDetected: false, marker };
46
+ }
47
+ /**
48
+ * Create a cycle detector from pipeline config.
49
+ * Reads maxRetries from stage configurations.
50
+ */
51
+ export function createCycleDetectorFromConfig(config) {
52
+ const detector = new PipelineCycleDetector();
53
+ if (config.stages) {
54
+ const overrides = {};
55
+ for (const stage of config.stages) {
56
+ const maxRetries = stage.onFailure?.maxRetries;
57
+ if (maxRetries !== undefined) {
58
+ if (stage.name === 'code') {
59
+ overrides['fix-ci'] = maxRetries;
60
+ }
61
+ else if (stage.name === 'review') {
62
+ overrides['fix-review'] = maxRetries;
63
+ }
64
+ else if (stage.name === 'admission' ||
65
+ stage.name === 'triage' ||
66
+ stage.name === 'agent') {
67
+ overrides[stage.name] = maxRetries;
68
+ }
69
+ }
70
+ }
71
+ if (Object.keys(overrides).length > 0) {
72
+ detector.updateMaxInvocations(overrides);
73
+ }
74
+ }
75
+ return detector;
76
+ }
77
+ //# sourceMappingURL=cycle-utils.js.map
@@ -136,5 +136,10 @@ export declare const NOTIFICATION_TITLES: {
136
136
  readonly fixCIAgentFailed: "AI-SDLC: Fix-CI Agent Failed";
137
137
  readonly fixCIGuardrailViolations: "AI-SDLC: Fix-CI Guardrail Violations";
138
138
  readonly fixCIApplied: "AI-SDLC: Fix-CI Applied";
139
+ readonly fixReviewRetryLimit: "AI-SDLC: Fix-Review Retry Limit Reached";
140
+ readonly fixReviewAgentFailed: "AI-SDLC: Fix-Review Agent Failed";
141
+ readonly fixReviewGuardrailViolations: "AI-SDLC: Fix-Review Guardrail Violations";
142
+ readonly fixReviewApplied: "AI-SDLC: Fix-Review Applied";
143
+ readonly pipelineCycleDetected: "AI-SDLC: Pipeline Cycle Detected";
139
144
  };
140
145
  //# sourceMappingURL=defaults.d.ts.map
package/dist/defaults.js CHANGED
@@ -214,5 +214,10 @@ export const NOTIFICATION_TITLES = {
214
214
  fixCIAgentFailed: 'AI-SDLC: Fix-CI Agent Failed',
215
215
  fixCIGuardrailViolations: 'AI-SDLC: Fix-CI Guardrail Violations',
216
216
  fixCIApplied: 'AI-SDLC: Fix-CI Applied',
217
+ fixReviewRetryLimit: 'AI-SDLC: Fix-Review Retry Limit Reached',
218
+ fixReviewAgentFailed: 'AI-SDLC: Fix-Review Agent Failed',
219
+ fixReviewGuardrailViolations: 'AI-SDLC: Fix-Review Guardrail Violations',
220
+ fixReviewApplied: 'AI-SDLC: Fix-Review Applied',
221
+ pipelineCycleDetected: 'AI-SDLC: Pipeline Cycle Detected',
217
222
  };
218
223
  //# sourceMappingURL=defaults.js.map