@pupt/cli 0.0.1 → 2.3.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/LICENSE +21 -0
- package/README.md +54 -29
- package/dist/annotations/annotation-analyzer.d.ts +17 -0
- package/dist/annotations/annotation-analyzer.d.ts.map +1 -0
- package/dist/annotations/annotation-analyzer.js +145 -0
- package/dist/annotations/annotation-analyzer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +435 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +164 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/annotate.d.ts +2 -0
- package/dist/commands/annotate.d.ts.map +1 -0
- package/dist/commands/annotate.js +99 -0
- package/dist/commands/annotate.js.map +1 -0
- package/dist/commands/base-command.d.ts +23 -0
- package/dist/commands/base-command.d.ts.map +1 -0
- package/dist/commands/base-command.js +41 -0
- package/dist/commands/base-command.js.map +1 -0
- package/dist/commands/cache.d.ts +9 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +31 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +93 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/edit.d.ts +2 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +35 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +26 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/history.d.ts +12 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +317 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +137 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +263 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +160 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +32 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +367 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +45 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +113 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config/config-manager.d.ts +19 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +221 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/global-paths.d.ts +5 -0
- package/dist/config/global-paths.d.ts.map +1 -0
- package/dist/config/global-paths.js +16 -0
- package/dist/config/global-paths.js.map +1 -0
- package/dist/config/migration.d.ts +12 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +270 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/history/enhanced-history-manager.d.ts +27 -0
- package/dist/history/enhanced-history-manager.d.ts.map +1 -0
- package/dist/history/enhanced-history-manager.js +116 -0
- package/dist/history/enhanced-history-manager.js.map +1 -0
- package/dist/history/history-manager.d.ts +43 -0
- package/dist/history/history-manager.d.ts.map +1 -0
- package/dist/history/history-manager.js +229 -0
- package/dist/history/history-manager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts +11 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.js +53 -0
- package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts +3 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.js +9 -0
- package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
- package/dist/schemas/config-schema.d.ts +1637 -0
- package/dist/schemas/config-schema.d.ts.map +1 -0
- package/dist/schemas/config-schema.js +136 -0
- package/dist/schemas/config-schema.js.map +1 -0
- package/dist/search/search-engine.d.ts +8 -0
- package/dist/search/search-engine.d.ts.map +1 -0
- package/dist/search/search-engine.js +53 -0
- package/dist/search/search-engine.js.map +1 -0
- package/dist/services/git-service.d.ts +28 -0
- package/dist/services/git-service.d.ts.map +1 -0
- package/dist/services/git-service.js +157 -0
- package/dist/services/git-service.js.map +1 -0
- package/dist/services/input-collector.d.ts +9 -0
- package/dist/services/input-collector.d.ts.map +1 -0
- package/dist/services/input-collector.js +162 -0
- package/dist/services/input-collector.js.map +1 -0
- package/dist/services/logging-service.d.ts +49 -0
- package/dist/services/logging-service.d.ts.map +1 -0
- package/dist/services/logging-service.js +203 -0
- package/dist/services/logging-service.js.map +1 -0
- package/dist/services/module-cache.d.ts +42 -0
- package/dist/services/module-cache.d.ts.map +1 -0
- package/dist/services/module-cache.js +205 -0
- package/dist/services/module-cache.js.map +1 -0
- package/dist/services/module-entry-builder.d.ts +20 -0
- package/dist/services/module-entry-builder.d.ts.map +1 -0
- package/dist/services/module-entry-builder.js +71 -0
- package/dist/services/module-entry-builder.js.map +1 -0
- package/dist/services/output-capture-service.d.ts +28 -0
- package/dist/services/output-capture-service.d.ts.map +1 -0
- package/dist/services/output-capture-service.js +348 -0
- package/dist/services/output-capture-service.js.map +1 -0
- package/dist/services/package-manager.d.ts +18 -0
- package/dist/services/package-manager.d.ts.map +1 -0
- package/dist/services/package-manager.js +141 -0
- package/dist/services/package-manager.js.map +1 -0
- package/dist/services/pattern-detector.d.ts +15 -0
- package/dist/services/pattern-detector.d.ts.map +1 -0
- package/dist/services/pattern-detector.js +228 -0
- package/dist/services/pattern-detector.js.map +1 -0
- package/dist/services/prompt-resolver.d.ts +32 -0
- package/dist/services/prompt-resolver.d.ts.map +1 -0
- package/dist/services/prompt-resolver.js +73 -0
- package/dist/services/prompt-resolver.js.map +1 -0
- package/dist/services/pupt-prompt-source.d.ts +16 -0
- package/dist/services/pupt-prompt-source.d.ts.map +1 -0
- package/dist/services/pupt-prompt-source.js +74 -0
- package/dist/services/pupt-prompt-source.js.map +1 -0
- package/dist/services/pupt-service.d.ts +33 -0
- package/dist/services/pupt-service.d.ts.map +1 -0
- package/dist/services/pupt-service.js +119 -0
- package/dist/services/pupt-service.js.map +1 -0
- package/dist/services/review-data-builder.d.ts +25 -0
- package/dist/services/review-data-builder.d.ts.map +1 -0
- package/dist/services/review-data-builder.js +333 -0
- package/dist/services/review-data-builder.js.map +1 -0
- package/dist/services/suggestion-generator.d.ts +11 -0
- package/dist/services/suggestion-generator.d.ts.map +1 -0
- package/dist/services/suggestion-generator.js +158 -0
- package/dist/services/suggestion-generator.js.map +1 -0
- package/dist/services/ui-service.d.ts +49 -0
- package/dist/services/ui-service.d.ts.map +1 -0
- package/dist/services/ui-service.js +196 -0
- package/dist/services/ui-service.js.map +1 -0
- package/dist/types/annotations.d.ts +50 -0
- package/dist/types/annotations.d.ts.map +1 -0
- package/dist/types/annotations.js +2 -0
- package/dist/types/annotations.js.map +1 -0
- package/dist/types/config.d.ts +110 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +12 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/history.d.ts +36 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js +2 -0
- package/dist/types/history.js.map +1 -0
- package/dist/types/patterns.d.ts +25 -0
- package/dist/types/patterns.d.ts.map +1 -0
- package/dist/types/patterns.js +2 -0
- package/dist/types/patterns.js.map +1 -0
- package/dist/types/prompt.d.ts +29 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +24 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/review.d.ts +81 -0
- package/dist/types/review.d.ts.map +1 -0
- package/dist/types/review.js +2 -0
- package/dist/types/review.js.map +1 -0
- package/dist/ui/console-ui.d.ts +30 -0
- package/dist/ui/console-ui.d.ts.map +1 -0
- package/dist/ui/console-ui.js +88 -0
- package/dist/ui/console-ui.js.map +1 -0
- package/dist/ui/interactive-search.d.ts +8 -0
- package/dist/ui/interactive-search.d.ts.map +1 -0
- package/dist/ui/interactive-search.js +29 -0
- package/dist/ui/interactive-search.js.map +1 -0
- package/dist/utils/annotation-migration.d.ts +12 -0
- package/dist/utils/annotation-migration.d.ts.map +1 -0
- package/dist/utils/annotation-migration.js +88 -0
- package/dist/utils/annotation-migration.js.map +1 -0
- package/dist/utils/date-formatter.d.ts +10 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +46 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/editor.d.ts +14 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +52 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/errors.d.ts +58 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +275 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/git-info.d.ts +10 -0
- package/dist/utils/git-info.d.ts.map +1 -0
- package/dist/utils/git-info.js +44 -0
- package/dist/utils/git-info.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +72 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +143 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/platform.d.ts +9 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +45 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/project-root.d.ts +22 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +226 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/utils/prompt-dir-resolver.d.ts +5 -0
- package/dist/utils/prompt-dir-resolver.d.ts.map +1 -0
- package/dist/utils/prompt-dir-resolver.js +25 -0
- package/dist/utils/prompt-dir-resolver.js.map +1 -0
- package/dist/utils/security.d.ts +5 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +57 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/tool-detection.d.ts +14 -0
- package/dist/utils/tool-detection.d.ts.map +1 -0
- package/dist/utils/tool-detection.js +43 -0
- package/dist/utils/tool-detection.js.map +1 -0
- package/package.json +79 -7
- package/prompts/prompts/ad-hoc-long.prompt +60 -0
- package/prompts/prompts/ad-hoc.prompt +29 -0
- package/prompts/prompts/code-review.prompt +99 -0
- package/prompts/prompts/debugging-error-message.prompt +81 -0
- package/prompts/prompts/fix-github-actions.prompt +62 -0
- package/prompts/prompts/fix-test-errors.prompt +73 -0
- package/prompts/prompts/git-commit-comment.prompt +61 -0
- package/prompts/prompts/implementation-phase.prompt +53 -0
- package/prompts/prompts/implementation-plan.prompt +101 -0
- package/prompts/prompts/new-feature.prompt +89 -0
- package/prompts/prompts/new-project.prompt +9 -0
- package/prompts/prompts/one-shot-change.prompt +79 -0
- package/prompts/prompts/pupt-prompt-improvement.prompt +270 -0
- package/prompts/prompts/simple-test.prompt +8 -0
- package/prompts/prompts/update-design.prompt +71 -0
- package/prompts/prompts/update-documentation.prompt +6 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
export class PatternDetector {
|
|
2
|
+
MIN_FREQUENCY_THRESHOLD = 3;
|
|
3
|
+
detectPatterns(annotations) {
|
|
4
|
+
const patterns = [];
|
|
5
|
+
// Detect verification gap patterns
|
|
6
|
+
const verificationGapPattern = this.detectVerificationGaps(annotations);
|
|
7
|
+
if (verificationGapPattern) {
|
|
8
|
+
patterns.push(verificationGapPattern);
|
|
9
|
+
}
|
|
10
|
+
// Detect incomplete task patterns
|
|
11
|
+
const incompleteTaskPattern = this.detectIncompleteTasks(annotations);
|
|
12
|
+
if (incompleteTaskPattern) {
|
|
13
|
+
patterns.push(incompleteTaskPattern);
|
|
14
|
+
}
|
|
15
|
+
// Detect environment-specific patterns
|
|
16
|
+
const environmentPattern = this.detectEnvironmentSpecificFailures(annotations);
|
|
17
|
+
if (environmentPattern) {
|
|
18
|
+
patterns.push(environmentPattern);
|
|
19
|
+
}
|
|
20
|
+
// Detect ambiguous objective patterns
|
|
21
|
+
const ambiguousPattern = this.detectAmbiguousObjectives(annotations);
|
|
22
|
+
if (ambiguousPattern) {
|
|
23
|
+
patterns.push(ambiguousPattern);
|
|
24
|
+
}
|
|
25
|
+
return patterns;
|
|
26
|
+
}
|
|
27
|
+
detectVerificationGaps(annotations) {
|
|
28
|
+
const verificationPatterns = [
|
|
29
|
+
/test.*fail.*claim.*success/i,
|
|
30
|
+
/claim.*success.*fail/i,
|
|
31
|
+
/verification.*fail/i,
|
|
32
|
+
/still failing/i,
|
|
33
|
+
/test.*still.*fail/i,
|
|
34
|
+
/claim.*complete.*fail/i,
|
|
35
|
+
/said.*done.*fail/i,
|
|
36
|
+
];
|
|
37
|
+
const matches = annotations.filter(annotation => {
|
|
38
|
+
const isFailure = annotation.status === 'partial' || annotation.status === 'failure';
|
|
39
|
+
const hasVerificationIssue = verificationPatterns.some(pattern => pattern.test(annotation.notes));
|
|
40
|
+
// Also check for generic failure patterns when it's a failure status
|
|
41
|
+
const hasFailurePattern = annotation.status === 'failure' &&
|
|
42
|
+
(annotation.notes.toLowerCase().includes('fail') ||
|
|
43
|
+
annotation.notes.toLowerCase().includes('error') ||
|
|
44
|
+
annotation.notes.toLowerCase().includes('pattern'));
|
|
45
|
+
return isFailure && (hasVerificationIssue || hasFailurePattern);
|
|
46
|
+
});
|
|
47
|
+
if (matches.length < this.MIN_FREQUENCY_THRESHOLD) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
type: 'verification_gap',
|
|
52
|
+
frequency: matches.length,
|
|
53
|
+
severity: this.calculateSeverity(matches.length, annotations.length),
|
|
54
|
+
evidence: matches.map(m => this.truncateEvidence(m.notes)),
|
|
55
|
+
affectedPrompts: this.getUniquePrompts(matches),
|
|
56
|
+
correlation_strength: this.calculateCorrelationStrength(matches, annotations),
|
|
57
|
+
affected_executions: matches.length,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
detectIncompleteTasks(annotations) {
|
|
61
|
+
const incompletePatterns = [
|
|
62
|
+
/stopped.*first.*error/i,
|
|
63
|
+
/incomplete.*task/i,
|
|
64
|
+
/did not.*complete.*all/i,
|
|
65
|
+
/only.*fixed.*one/i,
|
|
66
|
+
/left.*other.*fail/i,
|
|
67
|
+
/did not.*continue/i,
|
|
68
|
+
/partial.*implementation/i,
|
|
69
|
+
/incomplete/i,
|
|
70
|
+
/stopped.*after/i,
|
|
71
|
+
];
|
|
72
|
+
const matches = annotations.filter(annotation => {
|
|
73
|
+
const isPartial = annotation.status === 'partial';
|
|
74
|
+
const hasIncompletePattern = incompletePatterns.some(pattern => pattern.test(annotation.notes));
|
|
75
|
+
return isPartial && hasIncompletePattern;
|
|
76
|
+
});
|
|
77
|
+
if (matches.length < this.MIN_FREQUENCY_THRESHOLD) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
type: 'incomplete_task',
|
|
82
|
+
frequency: matches.length,
|
|
83
|
+
severity: this.calculateSeverity(matches.length, annotations.length),
|
|
84
|
+
evidence: matches.map(m => this.truncateEvidence(m.notes)),
|
|
85
|
+
affectedPrompts: this.getUniquePrompts(matches),
|
|
86
|
+
correlation_strength: this.calculateCorrelationStrength(matches, annotations),
|
|
87
|
+
affected_executions: matches.length,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
detectEnvironmentSpecificFailures(annotations) {
|
|
91
|
+
// Group failures by environment factors
|
|
92
|
+
const branchFailures = new Map();
|
|
93
|
+
annotations.forEach(annotation => {
|
|
94
|
+
if ((annotation.status === 'failure' || annotation.status === 'partial') &&
|
|
95
|
+
annotation.environment?.git_branch) {
|
|
96
|
+
const branch = annotation.environment.git_branch;
|
|
97
|
+
let failures = branchFailures.get(branch);
|
|
98
|
+
if (!failures) {
|
|
99
|
+
failures = [];
|
|
100
|
+
branchFailures.set(branch, failures);
|
|
101
|
+
}
|
|
102
|
+
failures.push(annotation);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
// Find branches with high failure rates
|
|
106
|
+
let maxFailures = 0;
|
|
107
|
+
let problematicBranch = '';
|
|
108
|
+
const branchEvidence = [];
|
|
109
|
+
branchFailures.forEach((failures, branch) => {
|
|
110
|
+
if (failures.length >= this.MIN_FREQUENCY_THRESHOLD && failures.length > maxFailures) {
|
|
111
|
+
maxFailures = failures.length;
|
|
112
|
+
problematicBranch = branch;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
// Collect evidence with branch prefix
|
|
116
|
+
const problematicFailures = branchFailures.get(problematicBranch) ?? [];
|
|
117
|
+
if (problematicBranch) {
|
|
118
|
+
problematicFailures.forEach(f => {
|
|
119
|
+
branchEvidence.push(`feature/test: ${this.truncateEvidence(f.notes)}`);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Also check for environment-related keywords in notes
|
|
123
|
+
const envPatterns = [
|
|
124
|
+
/branch.*specific/i,
|
|
125
|
+
/only.*fail.*branch/i,
|
|
126
|
+
/environment.*specific/i,
|
|
127
|
+
/works.*main.*fail/i,
|
|
128
|
+
];
|
|
129
|
+
const envMatches = annotations.filter(annotation => {
|
|
130
|
+
return envPatterns.some(pattern => pattern.test(annotation.notes));
|
|
131
|
+
});
|
|
132
|
+
const totalMatches = Math.max(maxFailures, envMatches.length);
|
|
133
|
+
if (totalMatches < this.MIN_FREQUENCY_THRESHOLD) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
type: 'environment_specific',
|
|
138
|
+
frequency: totalMatches,
|
|
139
|
+
severity: this.calculateSeverity(totalMatches, annotations.length),
|
|
140
|
+
evidence: branchEvidence.length > 0 ? branchEvidence : envMatches.map(m => this.truncateEvidence(m.notes)),
|
|
141
|
+
affectedPrompts: this.getUniquePrompts(branchEvidence.length > 0 ?
|
|
142
|
+
problematicFailures : envMatches),
|
|
143
|
+
correlation_strength: this.calculateCorrelationStrength(branchEvidence.length > 0 ? problematicFailures : envMatches, annotations),
|
|
144
|
+
affected_executions: totalMatches,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
detectAmbiguousObjectives(annotations) {
|
|
148
|
+
const ambiguousPatterns = [
|
|
149
|
+
/unclear.*what.*meant/i,
|
|
150
|
+
/ambiguous.*instruction/i,
|
|
151
|
+
/vague.*instruction/i,
|
|
152
|
+
/not sure.*which/i,
|
|
153
|
+
/unclear.*objective/i,
|
|
154
|
+
/confusing.*requirement/i,
|
|
155
|
+
/too.*vague/i,
|
|
156
|
+
];
|
|
157
|
+
const matches = annotations.filter(annotation => {
|
|
158
|
+
const isFailure = annotation.status === 'partial' || annotation.status === 'failure';
|
|
159
|
+
const hasAmbiguousPattern = ambiguousPatterns.some(pattern => pattern.test(annotation.notes));
|
|
160
|
+
return isFailure && hasAmbiguousPattern;
|
|
161
|
+
});
|
|
162
|
+
if (matches.length < this.MIN_FREQUENCY_THRESHOLD) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
type: 'ambiguous_objective',
|
|
167
|
+
frequency: matches.length,
|
|
168
|
+
severity: this.calculateSeverity(matches.length, annotations.length),
|
|
169
|
+
evidence: matches.map(m => this.truncateEvidence(m.notes)),
|
|
170
|
+
affectedPrompts: this.getUniquePrompts(matches),
|
|
171
|
+
correlation_strength: this.calculateCorrelationStrength(matches, annotations),
|
|
172
|
+
affected_executions: matches.length,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
calculateSeverity(frequency, total) {
|
|
176
|
+
if (total === 0) {
|
|
177
|
+
return 'low';
|
|
178
|
+
}
|
|
179
|
+
const percentage = frequency / total;
|
|
180
|
+
if (percentage > 0.5) {
|
|
181
|
+
return 'critical';
|
|
182
|
+
}
|
|
183
|
+
if (percentage >= 0.3) {
|
|
184
|
+
return 'high';
|
|
185
|
+
}
|
|
186
|
+
if (percentage >= 0.15) {
|
|
187
|
+
return 'medium';
|
|
188
|
+
}
|
|
189
|
+
return 'low';
|
|
190
|
+
}
|
|
191
|
+
calculateCorrelationStrength(matches, allAnnotations) {
|
|
192
|
+
if (allAnnotations.length === 0) {
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
// Calculate correlation based on:
|
|
196
|
+
// 1. How many of the failures have this pattern
|
|
197
|
+
// 2. How specific the pattern is to failures
|
|
198
|
+
const totalFailures = allAnnotations.filter(a => a.status === 'partial' || a.status === 'failure').length;
|
|
199
|
+
if (totalFailures === 0) {
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
// Proportion of failures that have this pattern
|
|
203
|
+
const failureCorrelation = matches.length / totalFailures;
|
|
204
|
+
// Specificity: how much this pattern appears in failures vs successes
|
|
205
|
+
const successesWithPattern = allAnnotations.filter(a => a.status === 'success' &&
|
|
206
|
+
matches.some(m => m.notes === a.notes)).length;
|
|
207
|
+
const specificity = successesWithPattern === 0 ? 1 :
|
|
208
|
+
matches.length / (matches.length + successesWithPattern);
|
|
209
|
+
// Combined correlation strength
|
|
210
|
+
return Math.min(failureCorrelation * specificity, 1.0);
|
|
211
|
+
}
|
|
212
|
+
getUniquePrompts(annotations) {
|
|
213
|
+
const prompts = new Set();
|
|
214
|
+
annotations.forEach(a => {
|
|
215
|
+
if (a.promptName) {
|
|
216
|
+
prompts.add(a.promptName);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
return Array.from(prompts);
|
|
220
|
+
}
|
|
221
|
+
truncateEvidence(text, maxLength = 100) {
|
|
222
|
+
if (text.length <= maxLength) {
|
|
223
|
+
return text;
|
|
224
|
+
}
|
|
225
|
+
return `${text.substring(0, maxLength - 3)}...`;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=pattern-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-detector.js","sourceRoot":"","sources":["../../src/services/pattern-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ModuleEntry } from '@pupt/lib';
|
|
2
|
+
import type { EnvironmentConfig } from '../types/config.js';
|
|
3
|
+
export interface ResolvedPrompt {
|
|
4
|
+
text: string;
|
|
5
|
+
templateInfo: {
|
|
6
|
+
templatePath: string;
|
|
7
|
+
templateContent: string;
|
|
8
|
+
variables: Map<string, unknown>;
|
|
9
|
+
finalPrompt: string;
|
|
10
|
+
title?: string;
|
|
11
|
+
summary?: string;
|
|
12
|
+
reviewFiles?: Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
value: unknown;
|
|
15
|
+
}>;
|
|
16
|
+
timestamp?: Date;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface ResolvePromptOptions {
|
|
20
|
+
modules: ModuleEntry[];
|
|
21
|
+
promptName?: string;
|
|
22
|
+
noInteractive?: boolean;
|
|
23
|
+
startTimestamp?: Date;
|
|
24
|
+
/** Environment configuration for prompt rendering */
|
|
25
|
+
environment?: EnvironmentConfig;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Discover, select, collect inputs, and render a prompt.
|
|
29
|
+
* Shared by both the default `pt` action and `pt run`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolvePrompt(options: ResolvePromptOptions): Promise<ResolvedPrompt>;
|
|
32
|
+
//# sourceMappingURL=prompt-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-resolver.d.ts","sourceRoot":"","sources":["../../src/services/prompt-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAO5D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACtD,SAAS,CAAC,EAAE,IAAI,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,qDAAqD;IACrD,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAsE1F"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { InteractiveSearch } from '../ui/interactive-search.js';
|
|
3
|
+
import { errors } from '../utils/errors.js';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { collectInputs } from './input-collector.js';
|
|
6
|
+
import { PuptService } from './pupt-service.js';
|
|
7
|
+
/**
|
|
8
|
+
* Discover, select, collect inputs, and render a prompt.
|
|
9
|
+
* Shared by both the default `pt` action and `pt run`.
|
|
10
|
+
*/
|
|
11
|
+
export async function resolvePrompt(options) {
|
|
12
|
+
const { modules, promptName, noInteractive, startTimestamp, environment } = options;
|
|
13
|
+
// Discover prompts with environment config
|
|
14
|
+
const puptService = new PuptService({ modules, environment });
|
|
15
|
+
await puptService.init();
|
|
16
|
+
// Display any module loading warnings
|
|
17
|
+
for (const warning of puptService.getWarnings()) {
|
|
18
|
+
logger.warn(warning);
|
|
19
|
+
}
|
|
20
|
+
let selected;
|
|
21
|
+
if (promptName) {
|
|
22
|
+
// Find specific prompt by name
|
|
23
|
+
const jsxPrompt = puptService.findPrompt(promptName);
|
|
24
|
+
const adapted = jsxPrompt
|
|
25
|
+
? puptService.getPromptsAsAdapted().find(p => p._source === jsxPrompt)
|
|
26
|
+
: undefined;
|
|
27
|
+
if (!adapted) {
|
|
28
|
+
throw errors.promptNotFound(promptName);
|
|
29
|
+
}
|
|
30
|
+
selected = adapted;
|
|
31
|
+
logger.log(chalk.blue(`\nUsing prompt: ${selected.title}`));
|
|
32
|
+
logger.log(chalk.dim(`Location: ${selected.path}\n`));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Interactive search
|
|
36
|
+
const prompts = puptService.getPromptsAsAdapted();
|
|
37
|
+
if (prompts.length === 0) {
|
|
38
|
+
throw errors.noPromptsFound([]);
|
|
39
|
+
}
|
|
40
|
+
const search = new InteractiveSearch();
|
|
41
|
+
selected = await search.selectPrompt(prompts);
|
|
42
|
+
logger.log(chalk.blue(`\nProcessing: ${selected.title}`));
|
|
43
|
+
logger.log(chalk.dim(`Location: ${selected.path}\n`));
|
|
44
|
+
}
|
|
45
|
+
// Collect inputs and render (wrap with environment if configured)
|
|
46
|
+
if (!selected._source) {
|
|
47
|
+
throw errors.promptNotFound(promptName ?? 'unknown');
|
|
48
|
+
}
|
|
49
|
+
const dp = puptService.wrapWithEnvironment(selected._source);
|
|
50
|
+
const inputs = await collectInputs(dp.getInputIterator(), noInteractive);
|
|
51
|
+
const renderResult = await dp.render({ inputs });
|
|
52
|
+
const { text } = renderResult;
|
|
53
|
+
const reviewFiles = renderResult.postExecution
|
|
54
|
+
?.filter((a) => a.type === 'reviewFile')
|
|
55
|
+
.map((a) => ({
|
|
56
|
+
name: a.file || '',
|
|
57
|
+
value: a.file || '',
|
|
58
|
+
}));
|
|
59
|
+
return {
|
|
60
|
+
text,
|
|
61
|
+
templateInfo: {
|
|
62
|
+
templatePath: selected.path,
|
|
63
|
+
templateContent: selected.content,
|
|
64
|
+
variables: inputs,
|
|
65
|
+
finalPrompt: text,
|
|
66
|
+
title: selected.title,
|
|
67
|
+
summary: selected.summary,
|
|
68
|
+
reviewFiles,
|
|
69
|
+
timestamp: startTimestamp,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=prompt-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-resolver.js","sourceRoot":"","sources":["../../src/services/prompt-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PromptSource } from '@pupt/lib';
|
|
2
|
+
/**
|
|
3
|
+
* Recursively scan a directory for .prompt files and return
|
|
4
|
+
* one PromptSource per file.
|
|
5
|
+
*
|
|
6
|
+
* This handles several gaps in pupt-lib's LocalPromptSource:
|
|
7
|
+
* 1. Recursive subdirectory scanning
|
|
8
|
+
* 2. JSX comment stripping at top of file
|
|
9
|
+
* 3. Neutralizing {inputs.xxx} references (so they don't throw ReferenceError)
|
|
10
|
+
* 4. Per-file error isolation (each file is its own module entry)
|
|
11
|
+
*
|
|
12
|
+
* Files are returned as .prompt so pupt-lib handles all preprocessing
|
|
13
|
+
* (imports, fragment wrapping, Babel transform, fragment unwrapping).
|
|
14
|
+
*/
|
|
15
|
+
export declare function scanLocalPromptDir(dirPath: string): Promise<PromptSource[]>;
|
|
16
|
+
//# sourceMappingURL=pupt-prompt-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pupt-prompt-source.d.ts","sourceRoot":"","sources":["../../src/services/pupt-prompt-source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,YAAY,EAAE,MAAM,WAAW,CAAC;AAwBnE;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAuBjF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
/**
|
|
4
|
+
* A PromptSource wrapping a single preprocessed file.
|
|
5
|
+
* Using one source per file gives per-file error isolation through
|
|
6
|
+
* pupt-lib's per-module error handling in Pupt.discoverPrompts().
|
|
7
|
+
*
|
|
8
|
+
* The `name` property provides a human-readable identifier used by
|
|
9
|
+
* pupt-lib for error messages (via getEntryDisplayName).
|
|
10
|
+
*/
|
|
11
|
+
class SingleFilePromptSource {
|
|
12
|
+
file;
|
|
13
|
+
name;
|
|
14
|
+
constructor(file, originalFilename) {
|
|
15
|
+
this.file = file;
|
|
16
|
+
this.name = originalFilename;
|
|
17
|
+
}
|
|
18
|
+
getPrompts() {
|
|
19
|
+
return Promise.resolve([this.file]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Recursively scan a directory for .prompt files and return
|
|
24
|
+
* one PromptSource per file.
|
|
25
|
+
*
|
|
26
|
+
* This handles several gaps in pupt-lib's LocalPromptSource:
|
|
27
|
+
* 1. Recursive subdirectory scanning
|
|
28
|
+
* 2. JSX comment stripping at top of file
|
|
29
|
+
* 3. Neutralizing {inputs.xxx} references (so they don't throw ReferenceError)
|
|
30
|
+
* 4. Per-file error isolation (each file is its own module entry)
|
|
31
|
+
*
|
|
32
|
+
* Files are returned as .prompt so pupt-lib handles all preprocessing
|
|
33
|
+
* (imports, fragment wrapping, Babel transform, fragment unwrapping).
|
|
34
|
+
*/
|
|
35
|
+
export async function scanLocalPromptDir(dirPath) {
|
|
36
|
+
const resolvedPath = path.resolve(dirPath);
|
|
37
|
+
if (!await fs.pathExists(resolvedPath)) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const files = [];
|
|
41
|
+
await scanRecursive(resolvedPath, files);
|
|
42
|
+
const sources = [];
|
|
43
|
+
for (const file of files) {
|
|
44
|
+
let content = await fs.readFile(file.fullPath, 'utf-8');
|
|
45
|
+
// Strip JSX comments at top of file (e.g., {/* Converted from test.md */})
|
|
46
|
+
content = content.trim().replace(/^\{\/\*[\s\S]*?\*\/\}\s*/g, '');
|
|
47
|
+
// Neutralize {inputs.xxx} references to prevent ReferenceError during compilation.
|
|
48
|
+
// Input discovery works through <Ask> components, not these expressions.
|
|
49
|
+
// Actual input values are substituted by pupt-lib's render() at render time.
|
|
50
|
+
content = neutralizeInputRefs(content);
|
|
51
|
+
sources.push(new SingleFilePromptSource({ filename: file.filename, content }, file.filename));
|
|
52
|
+
}
|
|
53
|
+
return sources;
|
|
54
|
+
}
|
|
55
|
+
async function scanRecursive(dir, results) {
|
|
56
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
const fullPath = path.join(dir, entry.name);
|
|
59
|
+
if (entry.isDirectory()) {
|
|
60
|
+
await scanRecursive(fullPath, results);
|
|
61
|
+
}
|
|
62
|
+
else if (entry.isFile() && entry.name.endsWith('.prompt')) {
|
|
63
|
+
results.push({ fullPath, filename: entry.name });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Replace {inputs.xxx} expressions with {""} to prevent ReferenceError
|
|
69
|
+
* during compilation. The <Ask> components remain intact for input discovery.
|
|
70
|
+
*/
|
|
71
|
+
function neutralizeInputRefs(content) {
|
|
72
|
+
return content.replace(/\{inputs\.\w+\}/g, '{""}');
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=pupt-prompt-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pupt-prompt-source.js","sourceRoot":"","sources":["../../src/services/pupt-prompt-source.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B;;;;;;;GAOG;AACH,MAAM,sBAAsB;IAGhB;IAFD,IAAI,CAAS;IACtB,YACU,IAA0B,EAClC,gBAAwB;QADhB,SAAI,GAAJ,IAAI,CAAsB;QAGlC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;IACD,UAAU;QACR,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAAA,OAAO,EAAE,CAAC;IAAA,CAAC;IAEpD,MAAM,KAAK,GAA6C,EAAE,CAAC;IAC3D,MAAM,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAExD,2EAA2E;QAC3E,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QAElE,mFAAmF;QACnF,yEAAyE;QACzE,6EAA6E;QAC7E,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEvC,OAAO,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,OAAiD;IAEjD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type DiscoveredPromptWithMethods, type ModuleEntry } from "@pupt/lib";
|
|
2
|
+
import type { EnvironmentConfig } from "../types/config.js";
|
|
3
|
+
import { Prompt } from "../types/prompt.js";
|
|
4
|
+
export interface PuptServiceConfig {
|
|
5
|
+
modules: ModuleEntry[];
|
|
6
|
+
/** Environment configuration for prompt rendering */
|
|
7
|
+
environment?: EnvironmentConfig;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Service that discovers and manages pupt-lib prompts.
|
|
11
|
+
* Delegates all prompt discovery and compilation to pupt-lib's Pupt class.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PuptService {
|
|
14
|
+
private pupt;
|
|
15
|
+
private config;
|
|
16
|
+
private initialized;
|
|
17
|
+
constructor(config: PuptServiceConfig);
|
|
18
|
+
init(): Promise<void>;
|
|
19
|
+
getPrompts(): DiscoveredPromptWithMethods[];
|
|
20
|
+
getWarnings(): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Get all discovered prompts as pupt Prompt objects (for use with search/UI).
|
|
23
|
+
*/
|
|
24
|
+
getPromptsAsAdapted(): Prompt[];
|
|
25
|
+
getPrompt(name: string): DiscoveredPromptWithMethods | undefined;
|
|
26
|
+
findPrompt(nameOrFilename: string): DiscoveredPromptWithMethods | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Wrap a DiscoveredPromptWithMethods to inject default environment config into render calls.
|
|
29
|
+
* Returns a new object with the same interface but with env config merged.
|
|
30
|
+
*/
|
|
31
|
+
wrapWithEnvironment(dp: DiscoveredPromptWithMethods): DiscoveredPromptWithMethods;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=pupt-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pupt-service.d.ts","sourceRoot":"","sources":["../../src/services/pupt-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,2BAA2B,EAGhC,KAAK,WAAW,EAInB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAwB,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA8DlE,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,qDAAqD;IACrD,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,iBAAiB;IAK/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,UAAU,IAAI,2BAA2B,EAAE;IAI3C,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAI/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,2BAA2B,GAAG,SAAS;IAIhE,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,2BAA2B,GAAG,SAAS;IAK3E;;;OAGG;IACH,mBAAmB,CAAC,EAAE,EAAE,2BAA2B,GAAG,2BAA2B;CAsBpF"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createEnvironment, inferProviderFromModel, Pupt, } from "@pupt/lib";
|
|
2
|
+
import { fromDiscoveredPrompt } from "../types/prompt.js";
|
|
3
|
+
/**
|
|
4
|
+
* Convert pupt's EnvironmentConfig to pupt-lib's EnvironmentContext.
|
|
5
|
+
* Only includes explicitly configured values (runtime values are auto-detected by pupt-lib).
|
|
6
|
+
*/
|
|
7
|
+
function toEnvironmentContext(envConfig) {
|
|
8
|
+
if (!envConfig) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
const result = {};
|
|
12
|
+
if (envConfig.llm) {
|
|
13
|
+
const model = envConfig.llm.model ?? "unspecified";
|
|
14
|
+
let { provider } = envConfig.llm;
|
|
15
|
+
if (!provider && model !== "unspecified") {
|
|
16
|
+
provider = inferProviderFromModel(model) ?? undefined;
|
|
17
|
+
}
|
|
18
|
+
const llm = {
|
|
19
|
+
model,
|
|
20
|
+
provider: provider ?? "unspecified",
|
|
21
|
+
};
|
|
22
|
+
if (envConfig.llm.maxTokens !== undefined) {
|
|
23
|
+
llm.maxTokens = envConfig.llm.maxTokens;
|
|
24
|
+
}
|
|
25
|
+
if (envConfig.llm.temperature !== undefined) {
|
|
26
|
+
llm.temperature = envConfig.llm.temperature;
|
|
27
|
+
}
|
|
28
|
+
result.llm = llm;
|
|
29
|
+
}
|
|
30
|
+
if (envConfig.output) {
|
|
31
|
+
const output = {
|
|
32
|
+
trim: envConfig.output.trim ?? true,
|
|
33
|
+
indent: envConfig.output.indent ?? " ",
|
|
34
|
+
};
|
|
35
|
+
if (envConfig.output.format && envConfig.output.format !== "unspecified") {
|
|
36
|
+
output.format = envConfig.output.format;
|
|
37
|
+
}
|
|
38
|
+
result.output = output;
|
|
39
|
+
}
|
|
40
|
+
if (envConfig.code) {
|
|
41
|
+
const code = {
|
|
42
|
+
language: envConfig.code.language ?? "unspecified",
|
|
43
|
+
};
|
|
44
|
+
if (envConfig.code.highlight !== undefined) {
|
|
45
|
+
code.highlight = envConfig.code.highlight;
|
|
46
|
+
}
|
|
47
|
+
result.code = code;
|
|
48
|
+
}
|
|
49
|
+
if (envConfig.user) {
|
|
50
|
+
result.user = {
|
|
51
|
+
editor: envConfig.user.editor ?? "unknown",
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Service that discovers and manages pupt-lib prompts.
|
|
58
|
+
* Delegates all prompt discovery and compilation to pupt-lib's Pupt class.
|
|
59
|
+
*/
|
|
60
|
+
export class PuptService {
|
|
61
|
+
pupt;
|
|
62
|
+
config;
|
|
63
|
+
initialized = false;
|
|
64
|
+
constructor(config) {
|
|
65
|
+
this.config = config;
|
|
66
|
+
this.pupt = new Pupt({ modules: config.modules });
|
|
67
|
+
}
|
|
68
|
+
async init() {
|
|
69
|
+
if (this.initialized) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
await this.pupt.init();
|
|
73
|
+
this.initialized = true;
|
|
74
|
+
}
|
|
75
|
+
getPrompts() {
|
|
76
|
+
return this.pupt.getPrompts();
|
|
77
|
+
}
|
|
78
|
+
getWarnings() {
|
|
79
|
+
return this.pupt.getWarnings();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get all discovered prompts as pupt Prompt objects (for use with search/UI).
|
|
83
|
+
*/
|
|
84
|
+
getPromptsAsAdapted() {
|
|
85
|
+
return this.getPrompts().map((dp) => fromDiscoveredPrompt(dp));
|
|
86
|
+
}
|
|
87
|
+
getPrompt(name) {
|
|
88
|
+
return this.pupt.getPrompt(name);
|
|
89
|
+
}
|
|
90
|
+
findPrompt(nameOrFilename) {
|
|
91
|
+
const normalized = nameOrFilename.replace(/\.(prompt|tsx|jsx)$/i, "");
|
|
92
|
+
return this.pupt.getPrompt(nameOrFilename) ?? this.pupt.getPrompt(normalized);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Wrap a DiscoveredPromptWithMethods to inject default environment config into render calls.
|
|
96
|
+
* Returns a new object with the same interface but with env config merged.
|
|
97
|
+
*/
|
|
98
|
+
wrapWithEnvironment(dp) {
|
|
99
|
+
const defaultEnv = this.config.environment;
|
|
100
|
+
if (!defaultEnv) {
|
|
101
|
+
return dp;
|
|
102
|
+
}
|
|
103
|
+
const envFromConfig = toEnvironmentContext(defaultEnv);
|
|
104
|
+
if (!envFromConfig) {
|
|
105
|
+
return dp;
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
...dp,
|
|
109
|
+
async render(options) {
|
|
110
|
+
const mergedEnv = createEnvironment({
|
|
111
|
+
...envFromConfig,
|
|
112
|
+
...options?.env,
|
|
113
|
+
});
|
|
114
|
+
return dp.render({ ...options, env: mergedEnv });
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=pupt-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pupt-service.js","sourceRoot":"","sources":["../../src/services/pupt-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ModuleEntry } from "@pupt/lib";
|
|
2
|
+
import type { Config } from "../types/config.js";
|
|
3
|
+
import type { ReviewData, ReviewOptions } from "../types/review.js";
|
|
4
|
+
export declare class ReviewDataBuilder {
|
|
5
|
+
private config;
|
|
6
|
+
private historyManager;
|
|
7
|
+
private puptService;
|
|
8
|
+
private annotationAnalyzer;
|
|
9
|
+
constructor(config: Config & {
|
|
10
|
+
modules?: ModuleEntry[];
|
|
11
|
+
});
|
|
12
|
+
buildReviewData(options: ReviewOptions): Promise<ReviewData>;
|
|
13
|
+
private filterBySince;
|
|
14
|
+
private parseSinceDate;
|
|
15
|
+
private groupByPrompt;
|
|
16
|
+
private buildPromptReviewData;
|
|
17
|
+
private getHistoryFileName;
|
|
18
|
+
private extractPromptName;
|
|
19
|
+
private getAnnotations;
|
|
20
|
+
private calculateUsageStatistics;
|
|
21
|
+
private calculateExecutionOutcomes;
|
|
22
|
+
private calculateMetadata;
|
|
23
|
+
private calculateDataCompleteness;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=review-data-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-data-builder.d.ts","sourceRoot":"","sources":["../../src/services/review-data-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAS7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAIR,UAAU,EAEV,aAAa,EAEhB,MAAM,oBAAoB,CAAC;AAG5B,qBAAa,iBAAiB;IAKd,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;gBAE3B,MAAM,EAAE,MAAM,GAAG;QAAE,OAAO,CAAC,EAAE,WAAW,EAAE,CAAA;KAAE;IAU1D,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAqClE,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;IAoCtB,OAAO,CAAC,aAAa;YAgBP,qBAAqB;IAmEnC,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,iBAAiB;YAWX,cAAc;IAqD5B,OAAO,CAAC,wBAAwB;IAyEhC,OAAO,CAAC,0BAA0B;IAwBlC,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,yBAAyB;CAuBpC"}
|