@rekshaw/promptmanager 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/cli/addCase.d.ts +11 -0
- package/dist/cli/addCase.js +100 -0
- package/dist/cli/addCase.js.map +1 -0
- package/dist/cli/addSuite.d.ts +7 -0
- package/dist/cli/addSuite.js +250 -0
- package/dist/cli/addSuite.js.map +1 -0
- package/dist/cli/doctor.d.ts +16 -0
- package/dist/cli/doctor.js +144 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/init.js +0 -4
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/promptBump.d.ts +6 -0
- package/dist/cli/promptBump.js +96 -0
- package/dist/cli/promptBump.js.map +1 -0
- package/dist/cli.js +56 -1
- package/dist/cli.js.map +1 -1
- package/dist/prompts.d.ts +2 -0
- package/dist/prompts.js +24 -15
- package/dist/prompts.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -40,6 +40,74 @@ promptmgr run --suite customer-email-parser --provider openai
|
|
|
40
40
|
promptmgr diff --baseline ./baseline.json --candidate ./candidate.json
|
|
41
41
|
promptmgr ci --suite customer-email-parser --provider openai --baseline ./baseline/run-report.json --fail-on-regression
|
|
42
42
|
promptmgr suggest --run ./candidate.json --with-ai
|
|
43
|
+
promptmgr add-suite refund-email-parser
|
|
44
|
+
promptmgr add-case refund-email-parser --input '{"email":"raw"}' --expected '{"field":"value"}'
|
|
45
|
+
promptmgr prompt bump refund-email-parser
|
|
46
|
+
promptmgr doctor
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Add many prompts fast
|
|
50
|
+
|
|
51
|
+
When teams already have many prompts, use `add-suite` to scaffold each new suite without hand-editing folders/files:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
promptmgr add-suite refund-email-parser
|
|
55
|
+
promptmgr add-suite booking-change-parser --from-suite customer-email-parser
|
|
56
|
+
promptmgr add-suite loyalty-upgrade-parser --prompt-id loyalty-upgrade
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
What it does:
|
|
60
|
+
|
|
61
|
+
- Appends a new suite entry into `promptmanager.config.ts` or `.json`
|
|
62
|
+
- Creates `prompts/<promptId>/v1.0.0.md`
|
|
63
|
+
- Creates `evals/<suiteId>/dataset.jsonl`, `schema.json`, and `assertions.json`
|
|
64
|
+
- Reuses `toolsModule` and model defaults from an existing suite template
|
|
65
|
+
|
|
66
|
+
Useful options:
|
|
67
|
+
|
|
68
|
+
- `--from-suite <suiteId>`: choose which existing suite to copy defaults from
|
|
69
|
+
- `--prompt-id <promptId>`: set a different prompt ID from suite ID
|
|
70
|
+
- `--config <path>`: target a non-default config file
|
|
71
|
+
- `--force`: overwrite scaffold files if they already exist
|
|
72
|
+
|
|
73
|
+
## Easier versioning
|
|
74
|
+
|
|
75
|
+
`meta.json` is optional. PromptManager auto-picks the latest `v*.md` file.
|
|
76
|
+
|
|
77
|
+
To make a new prompt version:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
promptmgr prompt bump customer-email-parser
|
|
81
|
+
promptmgr prompt bump customer-email-parser --part minor
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This creates the next file (for example `v1.0.1.md`) by copying the latest prompt body.
|
|
85
|
+
|
|
86
|
+
## Add eval cases quickly
|
|
87
|
+
|
|
88
|
+
Append one case without manually editing JSONL:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
promptmgr add-case customer-email-parser \
|
|
92
|
+
--case-id customer-email-002 \
|
|
93
|
+
--input '{"subject":"...","body":"..."}' \
|
|
94
|
+
--expected '{"customer_email":"x@y.com","reservation_code":"ABC123","departure_date":"2026-04-18","fare_type_raw":"Economy Flex","fare_type_normalized":"ECONOMY_FLEX"}' \
|
|
95
|
+
--tags smoke,happy-path
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Or load input/expected from files:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
promptmgr add-case customer-email-parser --input-file ./tmp/input.json --expected-file ./tmp/expected.json
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Setup health checks
|
|
105
|
+
|
|
106
|
+
Validate config + suite files before running evals:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
promptmgr doctor
|
|
110
|
+
promptmgr doctor --suite customer-email-parser
|
|
43
111
|
```
|
|
44
112
|
|
|
45
113
|
## Config contract
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface AddCaseOptions {
|
|
2
|
+
caseId?: string;
|
|
3
|
+
input?: string;
|
|
4
|
+
inputFile?: string;
|
|
5
|
+
expected?: string;
|
|
6
|
+
expectedFile?: string;
|
|
7
|
+
tags?: string;
|
|
8
|
+
config?: string;
|
|
9
|
+
dataset?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function runAddCase(cwd: string, suiteId: string, options: AddCaseOptions): Promise<void>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getSuite, loadConfig } from "../config.js";
|
|
4
|
+
function parseJsonValue(raw, label) {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(raw);
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
throw new Error(`Failed to parse ${label} as JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
async function loadJsonInput(label, inlineValue, filePathValue) {
|
|
13
|
+
if (inlineValue && filePathValue) {
|
|
14
|
+
throw new Error(`Provide either --${label} or --${label}-file, not both.`);
|
|
15
|
+
}
|
|
16
|
+
if (!inlineValue && !filePathValue) {
|
|
17
|
+
throw new Error(`Missing required --${label} (or --${label}-file).`);
|
|
18
|
+
}
|
|
19
|
+
if (inlineValue) {
|
|
20
|
+
return parseJsonValue(inlineValue, `--${label}`);
|
|
21
|
+
}
|
|
22
|
+
const resolved = path.resolve(filePathValue);
|
|
23
|
+
const raw = await fs.readFile(resolved, "utf8");
|
|
24
|
+
return parseJsonValue(raw, `--${label}-file (${resolved})`);
|
|
25
|
+
}
|
|
26
|
+
function parseTags(raw) {
|
|
27
|
+
if (!raw) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
return raw
|
|
31
|
+
.split(",")
|
|
32
|
+
.map((tag) => tag.trim())
|
|
33
|
+
.filter((tag) => tag.length > 0);
|
|
34
|
+
}
|
|
35
|
+
async function fileExists(filePath) {
|
|
36
|
+
try {
|
|
37
|
+
await fs.access(filePath);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function defaultCaseId() {
|
|
45
|
+
const stamp = new Date().toISOString().replace(/[-:.TZ]/g, "");
|
|
46
|
+
return `case-${stamp}`;
|
|
47
|
+
}
|
|
48
|
+
async function assertCaseIdUnique(datasetPath, caseId) {
|
|
49
|
+
if (!(await fileExists(datasetPath))) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const raw = await fs.readFile(datasetPath, "utf8");
|
|
53
|
+
const lines = raw
|
|
54
|
+
.split(/\r?\n/)
|
|
55
|
+
.map((line) => line.trim())
|
|
56
|
+
.filter((line) => line.length > 0 && !line.startsWith("#"));
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(line);
|
|
60
|
+
if (parsed.caseId === caseId) {
|
|
61
|
+
throw new Error(`Case ID '${caseId}' already exists in ${datasetPath}.`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error instanceof Error && error.message.startsWith("Case ID")) {
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
// Ignore malformed historical lines here; they will be flagged by run-time dataset parsing.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function runAddCase(cwd, suiteId, options) {
|
|
73
|
+
const resolvedCwd = path.resolve(cwd);
|
|
74
|
+
const { path: configPath, config } = await loadConfig(resolvedCwd, options.config);
|
|
75
|
+
const suite = getSuite(config, suiteId);
|
|
76
|
+
const configDir = path.dirname(configPath);
|
|
77
|
+
const datasetPath = options.dataset
|
|
78
|
+
? path.resolve(resolvedCwd, options.dataset)
|
|
79
|
+
: path.resolve(configDir, suite.datasetPath);
|
|
80
|
+
const caseId = options.caseId ?? defaultCaseId();
|
|
81
|
+
const input = await loadJsonInput("input", options.input, options.inputFile);
|
|
82
|
+
const expected = await loadJsonInput("expected", options.expected, options.expectedFile);
|
|
83
|
+
const tags = parseTags(options.tags);
|
|
84
|
+
await assertCaseIdUnique(datasetPath, caseId);
|
|
85
|
+
const payload = {
|
|
86
|
+
caseId,
|
|
87
|
+
input,
|
|
88
|
+
expected,
|
|
89
|
+
tags,
|
|
90
|
+
};
|
|
91
|
+
await fs.mkdir(path.dirname(datasetPath), { recursive: true });
|
|
92
|
+
let prefix = "";
|
|
93
|
+
if (await fileExists(datasetPath)) {
|
|
94
|
+
const current = await fs.readFile(datasetPath, "utf8");
|
|
95
|
+
prefix = current.endsWith("\n") || current.length === 0 ? "" : "\n";
|
|
96
|
+
}
|
|
97
|
+
await fs.appendFile(datasetPath, `${prefix}${JSON.stringify(payload)}\n`, "utf8");
|
|
98
|
+
process.stdout.write(`Added case '${caseId}' to ${datasetPath}\n`);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=addCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addCase.js","sourceRoot":"","sources":["../../src/cli/addCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { findConfigPath, loadConfig } from "../config.js";
|
|
4
|
+
const SUITE_ID_PATTERN = /^[a-z0-9][a-z0-9-_]*$/;
|
|
5
|
+
function q(value) {
|
|
6
|
+
return JSON.stringify(value);
|
|
7
|
+
}
|
|
8
|
+
function toPosixPath(...parts) {
|
|
9
|
+
return parts.join("/").replace(/\\+/g, "/");
|
|
10
|
+
}
|
|
11
|
+
function assertSuiteId(value) {
|
|
12
|
+
if (!SUITE_ID_PATTERN.test(value)) {
|
|
13
|
+
throw new Error(`Invalid suite id '${value}'. Use lowercase letters, digits, '-' or '_', and start with a letter or digit.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function pathExists(filePath) {
|
|
17
|
+
try {
|
|
18
|
+
await fs.access(filePath);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function writeFileSafe(filePath, content, force) {
|
|
26
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
27
|
+
if (!force && (await pathExists(filePath))) {
|
|
28
|
+
return "skipped";
|
|
29
|
+
}
|
|
30
|
+
await fs.writeFile(filePath, content, "utf8");
|
|
31
|
+
return "created";
|
|
32
|
+
}
|
|
33
|
+
async function copyOrWriteFileSafe(targetPath, sourcePath, fallbackContent, force) {
|
|
34
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
35
|
+
if (!force && (await pathExists(targetPath))) {
|
|
36
|
+
return "skipped";
|
|
37
|
+
}
|
|
38
|
+
if (await pathExists(sourcePath)) {
|
|
39
|
+
const source = await fs.readFile(sourcePath, "utf8");
|
|
40
|
+
await fs.writeFile(targetPath, source, "utf8");
|
|
41
|
+
return "created";
|
|
42
|
+
}
|
|
43
|
+
await fs.writeFile(targetPath, fallbackContent, "utf8");
|
|
44
|
+
return "created";
|
|
45
|
+
}
|
|
46
|
+
function findTemplateSuite(suites, fromSuite) {
|
|
47
|
+
if (suites.length === 0) {
|
|
48
|
+
throw new Error("Config has no suites. Run 'promptmgr init' first.");
|
|
49
|
+
}
|
|
50
|
+
if (!fromSuite) {
|
|
51
|
+
return suites[0];
|
|
52
|
+
}
|
|
53
|
+
const match = suites.find((suite) => suite.id === fromSuite);
|
|
54
|
+
if (!match) {
|
|
55
|
+
const available = suites.map((suite) => suite.id).join(", ");
|
|
56
|
+
throw new Error(`Unknown from-suite '${fromSuite}'. Available suites: ${available}`);
|
|
57
|
+
}
|
|
58
|
+
return match;
|
|
59
|
+
}
|
|
60
|
+
function buildSuite(template, suiteId, promptId) {
|
|
61
|
+
return {
|
|
62
|
+
id: suiteId,
|
|
63
|
+
promptId,
|
|
64
|
+
datasetPath: toPosixPath("evals", suiteId, "dataset.jsonl"),
|
|
65
|
+
schemaPath: toPosixPath("evals", suiteId, "schema.json"),
|
|
66
|
+
assertionsPath: toPosixPath("evals", suiteId, "assertions.json"),
|
|
67
|
+
toolsModule: template.toolsModule,
|
|
68
|
+
modelByProvider: {
|
|
69
|
+
openai: template.modelByProvider.openai,
|
|
70
|
+
anthropic: template.modelByProvider.anthropic,
|
|
71
|
+
google: template.modelByProvider.google,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function getLineIndent(source, index) {
|
|
76
|
+
const lineStart = source.lastIndexOf("\n", index) + 1;
|
|
77
|
+
const match = source.slice(lineStart).match(/^[ \t]*/);
|
|
78
|
+
return match?.[0] ?? "";
|
|
79
|
+
}
|
|
80
|
+
function findMatchingBracket(source, openIndex) {
|
|
81
|
+
let depth = 0;
|
|
82
|
+
let quote = null;
|
|
83
|
+
let escaping = false;
|
|
84
|
+
for (let i = openIndex; i < source.length; i += 1) {
|
|
85
|
+
const ch = source[i];
|
|
86
|
+
if (quote) {
|
|
87
|
+
if (escaping) {
|
|
88
|
+
escaping = false;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (ch === "\\") {
|
|
92
|
+
escaping = true;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (ch === quote) {
|
|
96
|
+
quote = null;
|
|
97
|
+
}
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (ch === "'" || ch === '"' || ch === "`") {
|
|
101
|
+
quote = ch;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (ch === "[") {
|
|
105
|
+
depth += 1;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (ch === "]") {
|
|
109
|
+
depth -= 1;
|
|
110
|
+
if (depth === 0) {
|
|
111
|
+
return i;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw new Error("Could not locate end of suites array in config.");
|
|
116
|
+
}
|
|
117
|
+
function serializeTsSuite(suite, itemIndent) {
|
|
118
|
+
const fieldIndent = `${itemIndent} `;
|
|
119
|
+
const modelIndent = `${fieldIndent} `;
|
|
120
|
+
return [
|
|
121
|
+
`${itemIndent}{`,
|
|
122
|
+
`${fieldIndent}id: ${q(suite.id)},`,
|
|
123
|
+
`${fieldIndent}promptId: ${q(suite.promptId)},`,
|
|
124
|
+
`${fieldIndent}datasetPath: ${q(suite.datasetPath)},`,
|
|
125
|
+
`${fieldIndent}schemaPath: ${q(suite.schemaPath)},`,
|
|
126
|
+
`${fieldIndent}assertionsPath: ${q(suite.assertionsPath)},`,
|
|
127
|
+
`${fieldIndent}toolsModule: ${q(suite.toolsModule)},`,
|
|
128
|
+
`${fieldIndent}modelByProvider: {`,
|
|
129
|
+
`${modelIndent}openai: ${q(suite.modelByProvider.openai)},`,
|
|
130
|
+
`${modelIndent}anthropic: ${q(suite.modelByProvider.anthropic)},`,
|
|
131
|
+
`${modelIndent}google: ${q(suite.modelByProvider.google)}`,
|
|
132
|
+
`${fieldIndent}}`,
|
|
133
|
+
`${itemIndent}}`,
|
|
134
|
+
].join("\n");
|
|
135
|
+
}
|
|
136
|
+
function insertSuiteIntoTsConfig(source, suite) {
|
|
137
|
+
const suitesMatch = /["']?suites["']?\s*:\s*\[/m.exec(source);
|
|
138
|
+
if (!suitesMatch) {
|
|
139
|
+
throw new Error("Could not find 'suites: [' in TypeScript config.");
|
|
140
|
+
}
|
|
141
|
+
const suitesIndex = suitesMatch.index;
|
|
142
|
+
const arrayOpen = source.indexOf("[", suitesIndex);
|
|
143
|
+
if (arrayOpen === -1) {
|
|
144
|
+
throw new Error("Could not parse suites array in TypeScript config.");
|
|
145
|
+
}
|
|
146
|
+
const arrayClose = findMatchingBracket(source, arrayOpen);
|
|
147
|
+
const suitesIndent = getLineIndent(source, suitesIndex);
|
|
148
|
+
const itemIndent = `${suitesIndent} `;
|
|
149
|
+
const suiteLiteral = serializeTsSuite(suite, itemIndent);
|
|
150
|
+
const arrayInner = source.slice(arrayOpen + 1, arrayClose);
|
|
151
|
+
if (arrayInner.trim().length === 0) {
|
|
152
|
+
const insertion = `\n${suiteLiteral}\n${suitesIndent}`;
|
|
153
|
+
return `${source.slice(0, arrayOpen + 1)}${insertion}${source.slice(arrayClose)}`;
|
|
154
|
+
}
|
|
155
|
+
let lastNonWhitespace = arrayClose - 1;
|
|
156
|
+
while (lastNonWhitespace > arrayOpen && /\s/.test(source[lastNonWhitespace])) {
|
|
157
|
+
lastNonWhitespace -= 1;
|
|
158
|
+
}
|
|
159
|
+
const separator = source[lastNonWhitespace] === "," ? "" : ",";
|
|
160
|
+
return [
|
|
161
|
+
source.slice(0, lastNonWhitespace + 1),
|
|
162
|
+
`${separator}\n${suiteLiteral}\n${suitesIndent}`,
|
|
163
|
+
source.slice(lastNonWhitespace + 1),
|
|
164
|
+
].join("");
|
|
165
|
+
}
|
|
166
|
+
async function appendSuiteToConfig(configPath, suite) {
|
|
167
|
+
const ext = path.extname(configPath).toLowerCase();
|
|
168
|
+
if (ext === ".json") {
|
|
169
|
+
const raw = await fs.readFile(configPath, "utf8");
|
|
170
|
+
const parsed = JSON.parse(raw);
|
|
171
|
+
if (!Array.isArray(parsed.suites)) {
|
|
172
|
+
throw new Error("Config JSON is missing a suites array.");
|
|
173
|
+
}
|
|
174
|
+
parsed.suites.push(suite);
|
|
175
|
+
await fs.writeFile(configPath, `${JSON.stringify(parsed, null, 2)}\n`, "utf8");
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (ext === ".ts") {
|
|
179
|
+
const source = await fs.readFile(configPath, "utf8");
|
|
180
|
+
const updated = insertSuiteIntoTsConfig(source, suite);
|
|
181
|
+
await fs.writeFile(configPath, updated, "utf8");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
throw new Error(`Unsupported config extension '${ext}'.`);
|
|
185
|
+
}
|
|
186
|
+
function defaultPromptContent(suiteId) {
|
|
187
|
+
return `You extract structured data for suite '${suiteId}'.
|
|
188
|
+
|
|
189
|
+
Rules:
|
|
190
|
+
1. Return valid JSON only.
|
|
191
|
+
2. Use tool-calling when a tool is required by this suite.
|
|
192
|
+
3. Return null for missing fields.
|
|
193
|
+
`;
|
|
194
|
+
}
|
|
195
|
+
const DEFAULT_SCHEMA = `${JSON.stringify({
|
|
196
|
+
type: "object",
|
|
197
|
+
properties: {},
|
|
198
|
+
required: [],
|
|
199
|
+
additionalProperties: true,
|
|
200
|
+
}, null, 2)}\n`;
|
|
201
|
+
const DEFAULT_ASSERTIONS = `${JSON.stringify({
|
|
202
|
+
requiredKeys: [],
|
|
203
|
+
allowAdditionalKeys: true,
|
|
204
|
+
variableFields: [],
|
|
205
|
+
fieldMatchers: {},
|
|
206
|
+
}, null, 2)}\n`;
|
|
207
|
+
const DEFAULT_DATASET = `# Add one JSON object per line\n# {"caseId":"example-001","input":{},"expected":{},"tags":["smoke"]}\n`;
|
|
208
|
+
export async function runAddSuite(cwd, suiteId, options) {
|
|
209
|
+
assertSuiteId(suiteId);
|
|
210
|
+
const resolvedCwd = path.resolve(cwd);
|
|
211
|
+
const { config, path: loadedConfigPath } = await loadConfig(resolvedCwd, options.config);
|
|
212
|
+
const configPath = await findConfigPath(resolvedCwd, options.config);
|
|
213
|
+
const configDir = path.dirname(loadedConfigPath);
|
|
214
|
+
if (config.suites.some((suite) => suite.id === suiteId)) {
|
|
215
|
+
throw new Error(`Suite '${suiteId}' already exists.`);
|
|
216
|
+
}
|
|
217
|
+
const templateSuite = findTemplateSuite(config.suites, options.fromSuite);
|
|
218
|
+
const promptId = options.promptId ?? suiteId;
|
|
219
|
+
const force = options.force ?? false;
|
|
220
|
+
const newSuite = buildSuite(templateSuite, suiteId, promptId);
|
|
221
|
+
const sourceSchemaPath = path.resolve(configDir, templateSuite.schemaPath);
|
|
222
|
+
const sourceAssertionsPath = path.resolve(configDir, templateSuite.assertionsPath);
|
|
223
|
+
const sourceDatasetPath = path.resolve(configDir, templateSuite.datasetPath);
|
|
224
|
+
const targetSchemaPath = path.resolve(configDir, newSuite.schemaPath);
|
|
225
|
+
const targetAssertionsPath = path.resolve(configDir, newSuite.assertionsPath);
|
|
226
|
+
const targetDatasetPath = path.resolve(configDir, newSuite.datasetPath);
|
|
227
|
+
const promptDir = path.resolve(resolvedCwd, "prompts", promptId);
|
|
228
|
+
const promptVersionPath = path.join(promptDir, "v1.0.0.md");
|
|
229
|
+
let created = 0;
|
|
230
|
+
let skipped = 0;
|
|
231
|
+
const outcomes = [
|
|
232
|
+
await copyOrWriteFileSafe(targetSchemaPath, sourceSchemaPath, DEFAULT_SCHEMA, force),
|
|
233
|
+
await copyOrWriteFileSafe(targetAssertionsPath, sourceAssertionsPath, DEFAULT_ASSERTIONS, force),
|
|
234
|
+
await copyOrWriteFileSafe(targetDatasetPath, sourceDatasetPath, DEFAULT_DATASET, force),
|
|
235
|
+
await writeFileSafe(promptVersionPath, defaultPromptContent(suiteId), force),
|
|
236
|
+
];
|
|
237
|
+
for (const outcome of outcomes) {
|
|
238
|
+
if (outcome === "created") {
|
|
239
|
+
created += 1;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
skipped += 1;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
await appendSuiteToConfig(configPath, newSuite);
|
|
246
|
+
process.stdout.write(`Added suite '${suiteId}' to config: ${configPath}\n`);
|
|
247
|
+
process.stdout.write(`Scaffold files: created=${created} skipped=${skipped}\n`);
|
|
248
|
+
process.stdout.write(`Next: add real cases to ${newSuite.datasetPath} and refine prompts/${promptId}/v1.0.0.md\n`);
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=addSuite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addSuite.js","sourceRoot":"","sources":["../../src/cli/addSuite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface DoctorOptions {
|
|
2
|
+
config?: string;
|
|
3
|
+
suite?: string;
|
|
4
|
+
}
|
|
5
|
+
interface Issue {
|
|
6
|
+
level: "ok" | "warn" | "error";
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
interface DoctorResult {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
errors: number;
|
|
12
|
+
warnings: number;
|
|
13
|
+
issues: Issue[];
|
|
14
|
+
}
|
|
15
|
+
export declare function runDoctor(cwd: string, options: DoctorOptions): Promise<DoctorResult>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getSuite, loadConfig } from "../config.js";
|
|
4
|
+
import { loadDataset } from "../dataset.js";
|
|
5
|
+
import { listPromptVersions } from "../prompts.js";
|
|
6
|
+
import { readJsonFile } from "../utils.js";
|
|
7
|
+
async function exists(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
await fs.access(filePath);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function pushIssue(issues, level, message) {
|
|
17
|
+
issues.push({ level, message });
|
|
18
|
+
}
|
|
19
|
+
function printIssues(result) {
|
|
20
|
+
for (const issue of result.issues) {
|
|
21
|
+
const prefix = issue.level === "ok" ? "OK" : issue.level === "warn" ? "WARN" : "ERROR";
|
|
22
|
+
process.stdout.write(`[${prefix}] ${issue.message}\n`);
|
|
23
|
+
}
|
|
24
|
+
process.stdout.write(`\nDoctor summary: errors=${result.errors} warnings=${result.warnings} status=${result.ok ? "PASS" : "FAIL"}\n`);
|
|
25
|
+
}
|
|
26
|
+
export async function runDoctor(cwd, options) {
|
|
27
|
+
const issues = [];
|
|
28
|
+
let loaded;
|
|
29
|
+
try {
|
|
30
|
+
loaded = await loadConfig(cwd, options.config);
|
|
31
|
+
pushIssue(issues, "ok", `Loaded config: ${loaded.path}`);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
35
|
+
const result = {
|
|
36
|
+
ok: false,
|
|
37
|
+
errors: 1,
|
|
38
|
+
warnings: 0,
|
|
39
|
+
issues: [{ level: "error", message: `Failed to load config: ${message}` }],
|
|
40
|
+
};
|
|
41
|
+
printIssues(result);
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
const { config, path: configPath } = loaded;
|
|
45
|
+
const configDir = path.dirname(configPath);
|
|
46
|
+
const suiteIds = options.suite ? [getSuite(config, options.suite).id] : config.suites.map((suite) => suite.id);
|
|
47
|
+
for (const suiteId of suiteIds) {
|
|
48
|
+
const suite = getSuite(config, suiteId);
|
|
49
|
+
pushIssue(issues, "ok", `Checking suite: ${suiteId}`);
|
|
50
|
+
const promptDir = path.resolve(cwd, "prompts", suite.promptId);
|
|
51
|
+
if (!(await exists(promptDir))) {
|
|
52
|
+
pushIssue(issues, "error", `Missing prompt directory: ${promptDir}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const versions = await listPromptVersions(promptDir);
|
|
56
|
+
if (versions.length === 0) {
|
|
57
|
+
pushIssue(issues, "error", `No prompt versions found in ${promptDir}. Add files like v1.0.0.md`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
pushIssue(issues, "ok", `Prompt versions found: latest=v${versions[versions.length - 1]}.md`);
|
|
61
|
+
}
|
|
62
|
+
const metaPath = path.join(promptDir, "meta.json");
|
|
63
|
+
if (await exists(metaPath)) {
|
|
64
|
+
try {
|
|
65
|
+
const meta = await readJsonFile(metaPath);
|
|
66
|
+
if (meta.currentVersion && !(await exists(path.join(promptDir, `v${meta.currentVersion}.md`)))) {
|
|
67
|
+
pushIssue(issues, "warn", `meta.json currentVersion points to missing file v${meta.currentVersion}.md (safe to ignore; latest v*.md is auto-picked).`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
pushIssue(issues, "ok", "meta.json present (optional)");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
pushIssue(issues, "warn", `meta.json is unreadable (${error instanceof Error ? error.message : String(error)}); latest v*.md still works.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
pushIssue(issues, "ok", "meta.json not found (optional)");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const schemaPath = path.resolve(configDir, suite.schemaPath);
|
|
82
|
+
if (!(await exists(schemaPath))) {
|
|
83
|
+
pushIssue(issues, "error", `Missing schema file: ${schemaPath}`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
try {
|
|
87
|
+
JSON.parse(await fs.readFile(schemaPath, "utf8"));
|
|
88
|
+
pushIssue(issues, "ok", `schema.json valid: ${suite.schemaPath}`);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
pushIssue(issues, "error", `Invalid schema JSON at ${suite.schemaPath}: ${error}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const assertionsPath = path.resolve(configDir, suite.assertionsPath);
|
|
95
|
+
if (!(await exists(assertionsPath))) {
|
|
96
|
+
pushIssue(issues, "error", `Missing assertions file: ${assertionsPath}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
try {
|
|
100
|
+
JSON.parse(await fs.readFile(assertionsPath, "utf8"));
|
|
101
|
+
pushIssue(issues, "ok", `assertions.json valid: ${suite.assertionsPath}`);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
pushIssue(issues, "error", `Invalid assertions JSON at ${suite.assertionsPath}: ${error}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const datasetPath = path.resolve(configDir, suite.datasetPath);
|
|
108
|
+
if (!(await exists(datasetPath))) {
|
|
109
|
+
pushIssue(issues, "error", `Missing dataset file: ${datasetPath}`);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
try {
|
|
113
|
+
const dataset = await loadDataset(datasetPath);
|
|
114
|
+
if (dataset.length === 0) {
|
|
115
|
+
pushIssue(issues, "warn", `Dataset has no test cases: ${suite.datasetPath}`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
pushIssue(issues, "ok", `Dataset valid with ${dataset.length} case(s): ${suite.datasetPath}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
pushIssue(issues, "error", `Invalid dataset JSONL at ${suite.datasetPath}: ${error}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const toolsPath = path.resolve(configDir, suite.toolsModule);
|
|
126
|
+
if (!(await exists(toolsPath))) {
|
|
127
|
+
pushIssue(issues, "error", `Missing tools module: ${toolsPath}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
pushIssue(issues, "ok", `Tools module found: ${suite.toolsModule}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const errors = issues.filter((issue) => issue.level === "error").length;
|
|
134
|
+
const warnings = issues.filter((issue) => issue.level === "warn").length;
|
|
135
|
+
const result = {
|
|
136
|
+
ok: errors === 0,
|
|
137
|
+
errors,
|
|
138
|
+
warnings,
|
|
139
|
+
issues,
|
|
140
|
+
};
|
|
141
|
+
printIssues(result);
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/init.js
CHANGED
|
@@ -66,10 +66,6 @@ const config: PromptManagerConfig = {
|
|
|
66
66
|
export default config;
|
|
67
67
|
`,
|
|
68
68
|
},
|
|
69
|
-
{
|
|
70
|
-
filePath: path.resolve(cwd, "prompts/customer-email-parser/meta.json"),
|
|
71
|
-
content: `${JSON.stringify({ currentVersion: "1.0.0", versions: ["1.0.0"] }, null, 2)}\n`,
|
|
72
|
-
},
|
|
73
69
|
{
|
|
74
70
|
filePath: path.resolve(cwd, "prompts/customer-email-parser/v1.0.0.md"),
|
|
75
71
|
content: `You extract structured booking data from customer confirmation emails.
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,KAAK,UAAU,aAAa,CAAC,IAAkB,EAAE,KAAc;IAC7D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO;QACL;YACE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,yBAAyB,CAAC;YACtD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Cd;SACI;QACD;YACE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,yCAAyC,CAAC;YACtE,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getSuite, loadConfig } from "../config.js";
|
|
4
|
+
import { listPromptVersions } from "../prompts.js";
|
|
5
|
+
import { readJsonFile, writeJsonFile } from "../utils.js";
|
|
6
|
+
function parseSemver(version) {
|
|
7
|
+
const match = version.match(/^(\d+)\.(\d+)\.(\d+)$/);
|
|
8
|
+
if (!match) {
|
|
9
|
+
throw new Error(`Unsupported version '${version}'. Use x.y.z (for example 1.0.0) for prompt files.`);
|
|
10
|
+
}
|
|
11
|
+
return [
|
|
12
|
+
Number.parseInt(match[1], 10),
|
|
13
|
+
Number.parseInt(match[2], 10),
|
|
14
|
+
Number.parseInt(match[3], 10),
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
function formatSemver([major, minor, patch]) {
|
|
18
|
+
return `${major}.${minor}.${patch}`;
|
|
19
|
+
}
|
|
20
|
+
function bumpSemver(version, part) {
|
|
21
|
+
const [major, minor, patch] = parseSemver(version);
|
|
22
|
+
if (part === "major") {
|
|
23
|
+
return formatSemver([major + 1, 0, 0]);
|
|
24
|
+
}
|
|
25
|
+
if (part === "minor") {
|
|
26
|
+
return formatSemver([major, minor + 1, 0]);
|
|
27
|
+
}
|
|
28
|
+
return formatSemver([major, minor, patch + 1]);
|
|
29
|
+
}
|
|
30
|
+
async function updateMetaIfPresent(metaPath, version) {
|
|
31
|
+
try {
|
|
32
|
+
const meta = await readJsonFile(metaPath);
|
|
33
|
+
const versions = new Set(Array.isArray(meta.versions) ? meta.versions : []);
|
|
34
|
+
versions.add(version);
|
|
35
|
+
const updated = {
|
|
36
|
+
...meta,
|
|
37
|
+
currentVersion: version,
|
|
38
|
+
versions: [...versions],
|
|
39
|
+
};
|
|
40
|
+
await writeJsonFile(metaPath, updated);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function starterPrompt(suiteId) {
|
|
48
|
+
return `You extract structured data for suite '${suiteId}'.
|
|
49
|
+
|
|
50
|
+
Rules:
|
|
51
|
+
1. Return valid JSON only.
|
|
52
|
+
2. Use tool-calling only when needed.
|
|
53
|
+
3. Return null for missing fields.
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
async function pathExists(filePath) {
|
|
57
|
+
try {
|
|
58
|
+
await fs.access(filePath);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function runPromptBump(cwd, suiteId, options) {
|
|
66
|
+
const resolvedCwd = path.resolve(cwd);
|
|
67
|
+
const { config } = await loadConfig(resolvedCwd, options.config);
|
|
68
|
+
const suite = getSuite(config, suiteId);
|
|
69
|
+
const promptDir = path.resolve(resolvedCwd, "prompts", suite.promptId);
|
|
70
|
+
await fs.mkdir(promptDir, { recursive: true });
|
|
71
|
+
const versions = await listPromptVersions(promptDir);
|
|
72
|
+
const latest = versions.length > 0 ? versions[versions.length - 1] : undefined;
|
|
73
|
+
const part = options.part ?? "patch";
|
|
74
|
+
const nextVersion = latest ? bumpSemver(latest, part) : "1.0.0";
|
|
75
|
+
const sourceContent = latest
|
|
76
|
+
? await fs.readFile(path.join(promptDir, `v${latest}.md`), "utf8")
|
|
77
|
+
: starterPrompt(suiteId);
|
|
78
|
+
const targetPath = path.join(promptDir, `v${nextVersion}.md`);
|
|
79
|
+
if (!options.force && (await pathExists(targetPath))) {
|
|
80
|
+
throw new Error(`Prompt version v${nextVersion}.md already exists for prompt '${suite.promptId}'. Use --force to overwrite.`);
|
|
81
|
+
}
|
|
82
|
+
const finalContent = sourceContent.endsWith("\n") ? sourceContent : `${sourceContent}\n`;
|
|
83
|
+
await fs.writeFile(targetPath, finalContent, "utf8");
|
|
84
|
+
const metaUpdated = await updateMetaIfPresent(path.join(promptDir, "meta.json"), nextVersion);
|
|
85
|
+
process.stdout.write(`Created ${targetPath}\n`);
|
|
86
|
+
if (latest) {
|
|
87
|
+
process.stdout.write(`Bumped prompt version: ${latest} -> ${nextVersion} (${part})\n`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
process.stdout.write(`Created initial prompt version: ${nextVersion}\n`);
|
|
91
|
+
}
|
|
92
|
+
if (!metaUpdated) {
|
|
93
|
+
process.stdout.write("meta.json not found (or unreadable); this is OK because latest v*.md is auto-detected.\n");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=promptBump.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptBump.js","sourceRoot":"","sources":["../../src/cli/promptBump.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,10 @@ import { runSuite } from "./runSuite.js";
|
|
|
5
5
|
import { diffRuns } from "./diffRuns.js";
|
|
6
6
|
import { generateSuggestions } from "./suggestions.js";
|
|
7
7
|
import { runInit } from "./cli/init.js";
|
|
8
|
+
import { runAddSuite } from "./cli/addSuite.js";
|
|
9
|
+
import { runAddCase } from "./cli/addCase.js";
|
|
10
|
+
import { runPromptBump } from "./cli/promptBump.js";
|
|
11
|
+
import { runDoctor } from "./cli/doctor.js";
|
|
8
12
|
import { loadConfig } from "./config.js";
|
|
9
13
|
import { defaultRunReportPath, defaultSuggestionPath, printDiffSummary, printRunSummary, printSuggestionSummary, writeRunReport, writeSuggestionReport, } from "./reporting.js";
|
|
10
14
|
import { readJsonFile } from "./utils.js";
|
|
@@ -33,7 +37,7 @@ async function main() {
|
|
|
33
37
|
program
|
|
34
38
|
.name("promptmgr")
|
|
35
39
|
.description("PromptManager: regression-safe prompt + tool-calling evaluation")
|
|
36
|
-
.version("0.1.
|
|
40
|
+
.version("0.1.1");
|
|
37
41
|
program
|
|
38
42
|
.command("init")
|
|
39
43
|
.description("Initialize PromptManager scaffold in current repo")
|
|
@@ -41,6 +45,57 @@ async function main() {
|
|
|
41
45
|
.action(async (options) => {
|
|
42
46
|
await runInit(process.cwd(), options);
|
|
43
47
|
});
|
|
48
|
+
program
|
|
49
|
+
.command("add-suite")
|
|
50
|
+
.description("Scaffold a new suite and append it to promptmanager config")
|
|
51
|
+
.argument("<suiteId>", "Suite ID (e.g. refund-email-parser)")
|
|
52
|
+
.option("--prompt-id <promptId>", "Prompt ID (default: suiteId)")
|
|
53
|
+
.option("--from-suite <suiteId>", "Template suite to copy schema/assertions/tools/model defaults from")
|
|
54
|
+
.option("--config <path>", "Config path (default: promptmanager.config.ts/json)")
|
|
55
|
+
.option("--force", "Overwrite scaffold files if they already exist")
|
|
56
|
+
.action(async (suiteId, options) => {
|
|
57
|
+
await runAddSuite(process.cwd(), suiteId, options);
|
|
58
|
+
});
|
|
59
|
+
program
|
|
60
|
+
.command("add-case")
|
|
61
|
+
.description("Append one eval case to a suite dataset")
|
|
62
|
+
.argument("<suiteId>", "Suite ID")
|
|
63
|
+
.option("--case-id <id>", "Case ID (default: generated timestamp id)")
|
|
64
|
+
.option("--input <json>", "Input JSON payload")
|
|
65
|
+
.option("--input-file <path>", "Path to JSON input payload")
|
|
66
|
+
.option("--expected <json>", "Expected JSON payload")
|
|
67
|
+
.option("--expected-file <path>", "Path to JSON expected payload")
|
|
68
|
+
.option("--tags <csv>", "Comma-separated tags, e.g. smoke,refund")
|
|
69
|
+
.option("--dataset <path>", "Override dataset path")
|
|
70
|
+
.option("--config <path>", "Config path")
|
|
71
|
+
.action(async (suiteId, options) => {
|
|
72
|
+
await runAddCase(process.cwd(), suiteId, options);
|
|
73
|
+
});
|
|
74
|
+
const prompt = program.command("prompt").description("Prompt file workflows");
|
|
75
|
+
prompt
|
|
76
|
+
.command("bump")
|
|
77
|
+
.description("Create a new versioned prompt file for a suite")
|
|
78
|
+
.argument("<suiteId>", "Suite ID")
|
|
79
|
+
.option("--part <part>", "Version increment: patch|minor|major", "patch")
|
|
80
|
+
.option("--config <path>", "Config path")
|
|
81
|
+
.option("--force", "Overwrite target version file if it already exists")
|
|
82
|
+
.action(async (suiteId, options) => {
|
|
83
|
+
if (options.part && !["patch", "minor", "major"].includes(options.part)) {
|
|
84
|
+
throw new Error(`Invalid --part '${options.part}'. Expected patch|minor|major.`);
|
|
85
|
+
}
|
|
86
|
+
await runPromptBump(process.cwd(), suiteId, options);
|
|
87
|
+
});
|
|
88
|
+
program
|
|
89
|
+
.command("doctor")
|
|
90
|
+
.description("Validate promptmanager setup and suite files")
|
|
91
|
+
.option("--config <path>", "Config path")
|
|
92
|
+
.option("--suite <suiteId>", "Validate only one suite")
|
|
93
|
+
.action(async (options) => {
|
|
94
|
+
const result = await runDoctor(process.cwd(), options);
|
|
95
|
+
if (!result.ok) {
|
|
96
|
+
process.exitCode = 1;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
44
99
|
program
|
|
45
100
|
.command("run")
|
|
46
101
|
.description("Run one suite against a provider/model and emit run report")
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
import { PromptRecord } from "./types.js";
|
|
2
|
+
export declare function extractVersionFromFilename(name: string): string | null;
|
|
3
|
+
export declare function listPromptVersions(promptDir: string): Promise<string[]>;
|
|
2
4
|
export declare function loadPromptRecord(cwd: string, promptId: string): Promise<PromptRecord>;
|
package/dist/prompts.js
CHANGED
|
@@ -1,40 +1,49 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { compareSemver, readJsonFile } from "./utils.js";
|
|
4
|
-
function extractVersionFromFilename(name) {
|
|
4
|
+
export function extractVersionFromFilename(name) {
|
|
5
5
|
const match = name.match(/^v(.+)\.md$/);
|
|
6
6
|
return match?.[1] ?? null;
|
|
7
7
|
}
|
|
8
|
-
async function
|
|
8
|
+
export async function listPromptVersions(promptDir) {
|
|
9
9
|
const files = await fs.readdir(promptDir);
|
|
10
10
|
const versions = files
|
|
11
11
|
.map((file) => extractVersionFromFilename(file))
|
|
12
|
-
.filter((item) => Boolean(item))
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
.filter((item) => Boolean(item))
|
|
13
|
+
.sort(compareSemver);
|
|
14
|
+
return versions;
|
|
15
|
+
}
|
|
16
|
+
async function detectLatestVersion(promptDir) {
|
|
17
|
+
try {
|
|
18
|
+
const versions = await listPromptVersions(promptDir);
|
|
19
|
+
return versions.length > 0 ? versions[versions.length - 1] : undefined;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return undefined;
|
|
15
23
|
}
|
|
16
|
-
versions.sort(compareSemver);
|
|
17
|
-
return versions[versions.length - 1];
|
|
18
24
|
}
|
|
19
|
-
|
|
20
|
-
const promptDir = path.resolve(cwd, "prompts", promptId);
|
|
25
|
+
async function detectVersionFromMeta(promptDir) {
|
|
21
26
|
const metaPath = path.join(promptDir, "meta.json");
|
|
22
|
-
let version;
|
|
23
27
|
try {
|
|
24
28
|
const meta = await readJsonFile(metaPath);
|
|
25
29
|
if (meta.currentVersion) {
|
|
26
|
-
|
|
30
|
+
return meta.currentVersion;
|
|
27
31
|
}
|
|
28
|
-
|
|
32
|
+
if (Array.isArray(meta.versions) && meta.versions.length > 0) {
|
|
29
33
|
const sorted = [...meta.versions].sort(compareSemver);
|
|
30
|
-
|
|
34
|
+
return sorted[sorted.length - 1];
|
|
31
35
|
}
|
|
36
|
+
return undefined;
|
|
32
37
|
}
|
|
33
38
|
catch {
|
|
34
|
-
|
|
39
|
+
return undefined;
|
|
35
40
|
}
|
|
41
|
+
}
|
|
42
|
+
export async function loadPromptRecord(cwd, promptId) {
|
|
43
|
+
const promptDir = path.resolve(cwd, "prompts", promptId);
|
|
44
|
+
const version = (await detectLatestVersion(promptDir)) ?? (await detectVersionFromMeta(promptDir));
|
|
36
45
|
if (!version) {
|
|
37
|
-
version
|
|
46
|
+
throw new Error(`No prompt version found in ${promptDir}. Add files like v1.0.0.md (meta.json is optional).`);
|
|
38
47
|
}
|
|
39
48
|
const filePath = path.join(promptDir, `v${version}.md`);
|
|
40
49
|
const body = await fs.readFile(filePath, "utf8");
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzD,
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,KAAK;SACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;SAC/C,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC/C,IAAI,CAAC,aAAa,CAAC,CAAC;IACvB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IAClD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,SAAiB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAa,QAAQ,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAgB;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,CAAC,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;IACnG,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8BAA8B,SAAS,qDAAqD,CAC7F,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,OAAO,KAAK,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO;QACL,QAAQ;QACR,OAAO;QACP,IAAI;KACL,CAAC;AACJ,CAAC"}
|