pi-para 0.5.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/CHANGELOG.md +214 -0
- package/README.md +305 -0
- package/SETUP.md +171 -0
- package/dist/capture.d.ts +34 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +461 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +405 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +15 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +786 -0
- package/dist/commands.js.map +1 -0
- package/dist/context.d.ts +61 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +289 -0
- package/dist/context.js.map +1 -0
- package/dist/daemon.d.ts +49 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +226 -0
- package/dist/daemon.js.map +1 -0
- package/dist/frontmatter.d.ts +59 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +170 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gepa/dataset.d.ts +36 -0
- package/dist/gepa/dataset.d.ts.map +1 -0
- package/dist/gepa/dataset.js +148 -0
- package/dist/gepa/dataset.js.map +1 -0
- package/dist/gepa/evaluator.d.ts +51 -0
- package/dist/gepa/evaluator.d.ts.map +1 -0
- package/dist/gepa/evaluator.js +317 -0
- package/dist/gepa/evaluator.js.map +1 -0
- package/dist/gepa/index.d.ts +66 -0
- package/dist/gepa/index.d.ts.map +1 -0
- package/dist/gepa/index.js +240 -0
- package/dist/gepa/index.js.map +1 -0
- package/dist/gepa/llm.d.ts +35 -0
- package/dist/gepa/llm.d.ts.map +1 -0
- package/dist/gepa/llm.js +268 -0
- package/dist/gepa/llm.js.map +1 -0
- package/dist/gepa/optimized/capture-prompt.txt +65 -0
- package/dist/gepa/optimizer.d.ts +29 -0
- package/dist/gepa/optimizer.d.ts.map +1 -0
- package/dist/gepa/optimizer.js +249 -0
- package/dist/gepa/optimizer.js.map +1 -0
- package/dist/gepa/targets.d.ts +39 -0
- package/dist/gepa/targets.d.ts.map +1 -0
- package/dist/gepa/targets.js +326 -0
- package/dist/gepa/targets.js.map +1 -0
- package/dist/gepa/types.d.ts +168 -0
- package/dist/gepa/types.d.ts.map +1 -0
- package/dist/gepa/types.js +124 -0
- package/dist/gepa/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +294 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +88 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +105 -0
- package/dist/ingest.js.map +1 -0
- package/dist/link-discovery.d.ts +40 -0
- package/dist/link-discovery.d.ts.map +1 -0
- package/dist/link-discovery.js +122 -0
- package/dist/link-discovery.js.map +1 -0
- package/dist/link-utils.d.ts +30 -0
- package/dist/link-utils.d.ts.map +1 -0
- package/dist/link-utils.js +145 -0
- package/dist/link-utils.js.map +1 -0
- package/dist/lint.d.ts +39 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +827 -0
- package/dist/lint.js.map +1 -0
- package/dist/maintainer.d.ts +24 -0
- package/dist/maintainer.d.ts.map +1 -0
- package/dist/maintainer.js +358 -0
- package/dist/maintainer.js.map +1 -0
- package/dist/processor.d.ts +14 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +361 -0
- package/dist/processor.js.map +1 -0
- package/dist/query.d.ts +69 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +107 -0
- package/dist/query.js.map +1 -0
- package/dist/raw.d.ts +57 -0
- package/dist/raw.d.ts.map +1 -0
- package/dist/raw.js +219 -0
- package/dist/raw.js.map +1 -0
- package/dist/redact.d.ts +21 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +143 -0
- package/dist/redact.js.map +1 -0
- package/dist/scope.d.ts +54 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +161 -0
- package/dist/scope.js.map +1 -0
- package/dist/scripts/bulk-link-fix.d.ts +9 -0
- package/dist/scripts/bulk-link-fix.d.ts.map +1 -0
- package/dist/scripts/bulk-link-fix.js +106 -0
- package/dist/scripts/bulk-link-fix.js.map +1 -0
- package/dist/session-tools.d.ts +33 -0
- package/dist/session-tools.d.ts.map +1 -0
- package/dist/session-tools.js +211 -0
- package/dist/session-tools.js.map +1 -0
- package/dist/state.d.ts +54 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +176 -0
- package/dist/state.js.map +1 -0
- package/dist/store.d.ts +56 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +227 -0
- package/dist/store.js.map +1 -0
- package/dist/summarize.d.ts +56 -0
- package/dist/summarize.d.ts.map +1 -0
- package/dist/summarize.js +231 -0
- package/dist/summarize.js.map +1 -0
- package/dist/tag-registry.d.ts +56 -0
- package/dist/tag-registry.d.ts.map +1 -0
- package/dist/tag-registry.js +146 -0
- package/dist/tag-registry.js.map +1 -0
- package/dist/templates/prompts.d.ts +63 -0
- package/dist/templates/prompts.d.ts.map +1 -0
- package/dist/templates/prompts.js +260 -0
- package/dist/templates/prompts.js.map +1 -0
- package/dist/tools.d.ts +26 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1033 -0
- package/dist/tools.js.map +1 -0
- package/dist/watcher.d.ts +25 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +84 -0
- package/dist/watcher.js.map +1 -0
- package/dist/webui/client/dist/index.html +1885 -0
- package/dist/webui/server.d.ts +31 -0
- package/dist/webui/server.d.ts.map +1 -0
- package/dist/webui/server.js +566 -0
- package/dist/webui/server.js.map +1 -0
- package/dist/wiki.d.ts +103 -0
- package/dist/wiki.d.ts.map +1 -0
- package/dist/wiki.js +428 -0
- package/dist/wiki.js.map +1 -0
- package/package.json +142 -0
- package/scripts/gepa/__pycache__/dataset.cpython-313.pyc +0 -0
- package/scripts/gepa/__pycache__/lm_providers.cpython-313.pyc +0 -0
- package/scripts/gepa/__pycache__/metric.cpython-313.pyc +0 -0
- package/scripts/gepa/__pycache__/program.cpython-313.pyc +0 -0
- package/scripts/gepa/__pycache__/wiki_reader.cpython-313.pyc +0 -0
- package/scripts/gepa/dataset.py +192 -0
- package/scripts/gepa/lm_providers.py +472 -0
- package/scripts/gepa/metric.py +279 -0
- package/scripts/gepa/optimize.py +367 -0
- package/scripts/gepa/program.py +99 -0
- package/scripts/gepa/pyproject.toml +19 -0
- package/scripts/gepa/run-all.sh +53 -0
- package/scripts/gepa/uv.lock +2241 -0
- package/scripts/gepa/wiki_reader.py +113 -0
- package/skills/para/SKILL.md +77 -0
- package/skills/setup/SKILL.md +20 -0
- package/src/capture.ts +563 -0
- package/src/cli.ts +416 -0
- package/src/commands.ts +878 -0
- package/src/context.ts +390 -0
- package/src/daemon.ts +288 -0
- package/src/frontmatter.ts +219 -0
- package/src/gepa/index.ts +287 -0
- package/src/gepa/optimized/capture-prompt.txt +65 -0
- package/src/index.ts +384 -0
- package/src/ingest.ts +177 -0
- package/src/link-discovery.ts +170 -0
- package/src/link-utils.ts +169 -0
- package/src/lint.ts +1018 -0
- package/src/maintainer.ts +404 -0
- package/src/processor.ts +415 -0
- package/src/python/__pycache__/minimax_lm.cpython-312.pyc +0 -0
- package/src/python/minimax_lm.py +198 -0
- package/src/python/rlm_capture.py +215 -0
- package/src/query.ts +148 -0
- package/src/raw.ts +276 -0
- package/src/redact.ts +159 -0
- package/src/scope.ts +214 -0
- package/src/scripts/bulk-link-fix.ts +126 -0
- package/src/session-tools.ts +260 -0
- package/src/state.ts +271 -0
- package/src/store.ts +288 -0
- package/src/summarize.ts +273 -0
- package/src/tag-registry.ts +157 -0
- package/src/templates/index.md +17 -0
- package/src/templates/prompts.ts +274 -0
- package/src/templates/schema.md +116 -0
- package/src/tools.ts +1293 -0
- package/src/watcher.ts +101 -0
- package/src/webui/client/dist/index.html +1885 -0
- package/src/webui/server.ts +765 -0
- package/src/wiki.ts +550 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GEPA core optimization loop.
|
|
3
|
+
*
|
|
4
|
+
* Implements the Genetic-Evolutionary Prompt Adaptation algorithm:
|
|
5
|
+
* 1. Score the original prompt (baseline)
|
|
6
|
+
* 2. For N iterations: reflect → mutate → evaluate → update Pareto frontier
|
|
7
|
+
* 3. Return the best candidate from the frontier
|
|
8
|
+
*
|
|
9
|
+
* Early stopping: score >= 0.95, or no improvement in 10 consecutive iterations.
|
|
10
|
+
*/
|
|
11
|
+
import type { GEPAConfig, Target, Candidate, LLMClient, EvalResult } from "./types.js";
|
|
12
|
+
import { ParetoFrontier } from "./types.js";
|
|
13
|
+
declare const EARLY_STOP_SCORE = 0.95;
|
|
14
|
+
declare const STAGNATION_LIMIT = 10;
|
|
15
|
+
declare const REFLECTION_SYSTEM_PROMPT: string;
|
|
16
|
+
export interface OptimizationResult {
|
|
17
|
+
best: Candidate;
|
|
18
|
+
frontier: ParetoFrontier;
|
|
19
|
+
baselineScore: number;
|
|
20
|
+
baselineEval: EvalResult;
|
|
21
|
+
iterationsRun: number;
|
|
22
|
+
stopReason: "max-iterations" | "early-stop-score" | "stagnation";
|
|
23
|
+
}
|
|
24
|
+
declare function buildReflectionPrompt(parent: Candidate, target: Target, iteration: number, maxIterations: number): string;
|
|
25
|
+
declare function validateConstraints(content: string, constraints: string[]): string[];
|
|
26
|
+
declare function selectParent(frontier: ParetoFrontier): Candidate;
|
|
27
|
+
export declare function optimize(target: Target, config: GEPAConfig, llm: LLMClient, context: string): Promise<OptimizationResult>;
|
|
28
|
+
export { buildReflectionPrompt, validateConstraints, selectParent, REFLECTION_SYSTEM_PROMPT, EARLY_STOP_SCORE, STAGNATION_LIMIT, };
|
|
29
|
+
//# sourceMappingURL=optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../../src/gepa/optimizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACV,UAAU,EACV,MAAM,EACN,SAAS,EACT,SAAS,EACT,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAuB,MAAM,YAAY,CAAC;AAKjE,QAAA,MAAM,gBAAgB,OAAO,CAAC;AAC9B,QAAA,MAAM,gBAAgB,KAAK,CAAC;AAG5B,QAAA,MAAM,wBAAwB,QAE2B,CAAC;AAI1D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,UAAU,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,YAAY,CAAC;CAClE;AAID,iBAAS,qBAAqB,CAC5B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,CA+CR;AAID,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAe7E;AAmBD,iBAAS,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAWzD;AAID,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CA6I7B;AAiFD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GEPA core optimization loop.
|
|
3
|
+
*
|
|
4
|
+
* Implements the Genetic-Evolutionary Prompt Adaptation algorithm:
|
|
5
|
+
* 1. Score the original prompt (baseline)
|
|
6
|
+
* 2. For N iterations: reflect → mutate → evaluate → update Pareto frontier
|
|
7
|
+
* 3. Return the best candidate from the frontier
|
|
8
|
+
*
|
|
9
|
+
* Early stopping: score >= 0.95, or no improvement in 10 consecutive iterations.
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { ParetoFrontier, DEFAULT_GEPA_CONFIG } from "./types.js";
|
|
13
|
+
import { evaluateCandidate } from "./evaluator.js";
|
|
14
|
+
// -- Constants ---------------------------------------------------------------
|
|
15
|
+
const EARLY_STOP_SCORE = 0.95;
|
|
16
|
+
const STAGNATION_LIMIT = 10;
|
|
17
|
+
const MAX_MUTATION_RETRIES = 2;
|
|
18
|
+
const REFLECTION_SYSTEM_PROMPT = "You are a prompt optimization expert. You improve prompts by analyzing " +
|
|
19
|
+
"evaluation feedback and making targeted improvements.";
|
|
20
|
+
// -- Reflection prompt builder -----------------------------------------------
|
|
21
|
+
function buildReflectionPrompt(parent, target, iteration, maxIterations) {
|
|
22
|
+
const sortedDims = [...parent.dimensions].sort((a, b) => a.score - b.score);
|
|
23
|
+
const dimFeedback = sortedDims
|
|
24
|
+
.map((d) => ` - ${d.name}: ${d.score.toFixed(2)}/1.00 — ${d.feedback}`)
|
|
25
|
+
.join("\n");
|
|
26
|
+
const constraintSection = target.constraints.length > 0
|
|
27
|
+
? `\n## Required Constraints (MUST be preserved)\n\n${target.constraints.map((c, i) => `${i + 1}. ${c}`).join("\n")}\n`
|
|
28
|
+
: "";
|
|
29
|
+
const descSection = target.description
|
|
30
|
+
? `\n**Purpose**: ${target.description}\n`
|
|
31
|
+
: "";
|
|
32
|
+
const weakest = sortedDims.slice(0, 2);
|
|
33
|
+
const weakestNames = weakest.map((d) => d.name).join(" and ");
|
|
34
|
+
return `# Prompt Optimization — Iteration ${iteration}/${maxIterations}
|
|
35
|
+
|
|
36
|
+
## Target: "${target.name}" (${target.type})${descSection}
|
|
37
|
+
|
|
38
|
+
## Current Prompt (score: ${parent.score.toFixed(3)})
|
|
39
|
+
|
|
40
|
+
<current_prompt>
|
|
41
|
+
${parent.content}
|
|
42
|
+
</current_prompt>
|
|
43
|
+
|
|
44
|
+
## Evaluation Feedback (per dimension, weakest first)
|
|
45
|
+
|
|
46
|
+
${dimFeedback}
|
|
47
|
+
|
|
48
|
+
## Weakest Dimensions
|
|
49
|
+
|
|
50
|
+
Focus your improvements primarily on **${weakestNames}**, which scored lowest.
|
|
51
|
+
${constraintSection}
|
|
52
|
+
## Instructions
|
|
53
|
+
|
|
54
|
+
Produce an improved version of this prompt. Rules:
|
|
55
|
+
1. Keep ALL required concepts and constraints — do not remove anything essential.
|
|
56
|
+
2. Focus on improving the weakest dimensions listed above.
|
|
57
|
+
3. Make targeted, specific improvements — do not rewrite from scratch unnecessarily.
|
|
58
|
+
4. Every sentence must earn its place — remove filler, improve precision.
|
|
59
|
+
5. Maintain the same overall structure unless the structure itself is the problem.
|
|
60
|
+
|
|
61
|
+
Output ONLY the improved prompt text, nothing else. No explanations, no commentary, no markdown code fences wrapping the prompt.`;
|
|
62
|
+
}
|
|
63
|
+
// -- Constraint validation ---------------------------------------------------
|
|
64
|
+
function validateConstraints(content, constraints) {
|
|
65
|
+
if (constraints.length === 0)
|
|
66
|
+
return [];
|
|
67
|
+
const lower = content.toLowerCase();
|
|
68
|
+
const violations = [];
|
|
69
|
+
for (const constraint of constraints) {
|
|
70
|
+
const terms = extractKeyTerms(constraint);
|
|
71
|
+
const hasTerm = terms.some((t) => lower.includes(t.toLowerCase()));
|
|
72
|
+
if (!hasTerm) {
|
|
73
|
+
violations.push(constraint);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return violations;
|
|
77
|
+
}
|
|
78
|
+
function extractKeyTerms(constraint) {
|
|
79
|
+
const filler = new Set([
|
|
80
|
+
"must", "should", "include", "have", "contain", "mention",
|
|
81
|
+
"use", "provide", "specify", "ensure", "be", "the", "a", "an",
|
|
82
|
+
"and", "or", "for", "with", "about", "that", "this", "is", "are",
|
|
83
|
+
"in", "of", "to", "not", "no", "any", "all", "each",
|
|
84
|
+
]);
|
|
85
|
+
return constraint
|
|
86
|
+
.toLowerCase()
|
|
87
|
+
.replace(/[^a-z0-9\s-]/g, "")
|
|
88
|
+
.split(/\s+/)
|
|
89
|
+
.filter((w) => w.length > 2 && !filler.has(w));
|
|
90
|
+
}
|
|
91
|
+
// -- Parent selection --------------------------------------------------------
|
|
92
|
+
function selectParent(frontier) {
|
|
93
|
+
const best = frontier.best();
|
|
94
|
+
if (!best)
|
|
95
|
+
throw new Error("[gepa] Cannot select parent from empty frontier");
|
|
96
|
+
if (frontier.size <= 1 || Math.random() < 0.7) {
|
|
97
|
+
return best;
|
|
98
|
+
}
|
|
99
|
+
const candidates = frontier.candidates;
|
|
100
|
+
const idx = Math.floor(Math.random() * candidates.length);
|
|
101
|
+
return candidates[idx];
|
|
102
|
+
}
|
|
103
|
+
// -- Core optimization loop --------------------------------------------------
|
|
104
|
+
export async function optimize(target, config, llm, context) {
|
|
105
|
+
const maxIterations = config.maxIterations ?? DEFAULT_GEPA_CONFIG.maxIterations;
|
|
106
|
+
const paretoSize = config.paretoSize ?? DEFAULT_GEPA_CONFIG.paretoSize;
|
|
107
|
+
const frontier = new ParetoFrontier(paretoSize);
|
|
108
|
+
// Step 1: Baseline evaluation
|
|
109
|
+
console.log(`[gepa] Evaluating baseline for "${target.name}"...`);
|
|
110
|
+
const originalContent = await target.getCurrentContent();
|
|
111
|
+
const baselineEval = await evaluateCandidate(originalContent, target, context, llm);
|
|
112
|
+
const baselineCandidate = {
|
|
113
|
+
id: randomUUID(),
|
|
114
|
+
content: originalContent,
|
|
115
|
+
score: baselineEval.score,
|
|
116
|
+
dimensions: baselineEval.dimensions,
|
|
117
|
+
iteration: 0,
|
|
118
|
+
parentId: null,
|
|
119
|
+
mutationDescription: "original",
|
|
120
|
+
};
|
|
121
|
+
frontier.add(baselineCandidate);
|
|
122
|
+
console.log(`[gepa] Baseline score: ${baselineEval.score.toFixed(3)} ` +
|
|
123
|
+
`[${baselineEval.dimensions.map((d) => `${d.name}:${d.score.toFixed(2)}`).join(", ")}]`);
|
|
124
|
+
if (baselineEval.score >= EARLY_STOP_SCORE) {
|
|
125
|
+
console.log(`[gepa] Baseline score >= ${EARLY_STOP_SCORE}, no optimization needed`);
|
|
126
|
+
return {
|
|
127
|
+
best: baselineCandidate,
|
|
128
|
+
frontier,
|
|
129
|
+
baselineScore: baselineEval.score,
|
|
130
|
+
baselineEval,
|
|
131
|
+
iterationsRun: 0,
|
|
132
|
+
stopReason: "early-stop-score",
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Step 2: Optimization iterations
|
|
136
|
+
let iterationsWithoutImprovement = 0;
|
|
137
|
+
let bestScoreSeen = baselineEval.score;
|
|
138
|
+
let stopReason = "max-iterations";
|
|
139
|
+
for (let i = 1; i <= maxIterations; i++) {
|
|
140
|
+
const parent = selectParent(frontier);
|
|
141
|
+
const mutatedContent = await generateMutation(parent, target, llm, i, maxIterations);
|
|
142
|
+
if (!mutatedContent) {
|
|
143
|
+
console.log(`[gepa] iter ${i}/${maxIterations}: mutation failed, skipping`);
|
|
144
|
+
iterationsWithoutImprovement++;
|
|
145
|
+
if (iterationsWithoutImprovement >= STAGNATION_LIMIT) {
|
|
146
|
+
console.log(`[gepa] Stagnation: no improvement in ${STAGNATION_LIMIT} iterations, stopping`);
|
|
147
|
+
stopReason = "stagnation";
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const evalResult = await evaluateCandidate(mutatedContent, target, context, llm);
|
|
153
|
+
const candidate = {
|
|
154
|
+
id: randomUUID(),
|
|
155
|
+
content: mutatedContent,
|
|
156
|
+
score: evalResult.score,
|
|
157
|
+
dimensions: evalResult.dimensions,
|
|
158
|
+
iteration: i,
|
|
159
|
+
parentId: parent.id,
|
|
160
|
+
mutationDescription: `Mutation from "${parent.id.slice(0, 8)}" at iter ${i}`,
|
|
161
|
+
};
|
|
162
|
+
const added = frontier.add(candidate);
|
|
163
|
+
if (candidate.score > bestScoreSeen) {
|
|
164
|
+
bestScoreSeen = candidate.score;
|
|
165
|
+
iterationsWithoutImprovement = 0;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
iterationsWithoutImprovement++;
|
|
169
|
+
}
|
|
170
|
+
const currentBest = frontier.best();
|
|
171
|
+
const bestScore = currentBest?.score ?? baselineEval.score;
|
|
172
|
+
const addedMarker = added ? " +" : "";
|
|
173
|
+
console.log(`[gepa] iter ${i}/${maxIterations}: score ${candidate.score.toFixed(3)} ` +
|
|
174
|
+
`(best: ${bestScore.toFixed(3)})${addedMarker}`);
|
|
175
|
+
if (candidate.score >= EARLY_STOP_SCORE) {
|
|
176
|
+
console.log(`[gepa] Score ${candidate.score.toFixed(3)} >= ${EARLY_STOP_SCORE}, stopping early`);
|
|
177
|
+
stopReason = "early-stop-score";
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
if (iterationsWithoutImprovement >= STAGNATION_LIMIT) {
|
|
181
|
+
console.log(`[gepa] Stagnation: no improvement in ${STAGNATION_LIMIT} iterations, stopping`);
|
|
182
|
+
stopReason = "stagnation";
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Step 3: Return results
|
|
187
|
+
const best = frontier.best() ?? baselineCandidate;
|
|
188
|
+
const maxIterationSeen = Math.max(...frontier.candidates.map((c) => c.iteration), 0);
|
|
189
|
+
const improvement = best.score - baselineEval.score;
|
|
190
|
+
console.log(`[gepa] Optimization complete for "${target.name}": ` +
|
|
191
|
+
`${baselineEval.score.toFixed(3)} → ${best.score.toFixed(3)} ` +
|
|
192
|
+
`(+${improvement.toFixed(3)}) in ${maxIterationSeen} iterations ` +
|
|
193
|
+
`[${stopReason}]`);
|
|
194
|
+
return {
|
|
195
|
+
best,
|
|
196
|
+
frontier,
|
|
197
|
+
baselineScore: baselineEval.score,
|
|
198
|
+
baselineEval,
|
|
199
|
+
iterationsRun: maxIterationSeen,
|
|
200
|
+
stopReason,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
// -- Mutation generation -----------------------------------------------------
|
|
204
|
+
async function generateMutation(parent, target, llm, iteration, maxIterations) {
|
|
205
|
+
for (let attempt = 0; attempt <= MAX_MUTATION_RETRIES; attempt++) {
|
|
206
|
+
try {
|
|
207
|
+
const reflectionPrompt = buildReflectionPrompt(parent, target, iteration, maxIterations);
|
|
208
|
+
const response = await llm.complete(reflectionPrompt, REFLECTION_SYSTEM_PROMPT);
|
|
209
|
+
const mutated = cleanMutationResponse(response);
|
|
210
|
+
if (!mutated || mutated.length < 50) {
|
|
211
|
+
console.warn(`[gepa] Mutation too short (${mutated?.length ?? 0} chars), ` +
|
|
212
|
+
`retry ${attempt + 1}/${MAX_MUTATION_RETRIES + 1}`);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const violations = validateConstraints(mutated, target.constraints);
|
|
216
|
+
if (violations.length > 0) {
|
|
217
|
+
console.warn(`[gepa] Mutation violates ${violations.length} constraint(s), ` +
|
|
218
|
+
`retry ${attempt + 1}/${MAX_MUTATION_RETRIES + 1}`);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (mutated.trim() === parent.content.trim()) {
|
|
222
|
+
console.warn(`[gepa] Mutation identical to parent, retry ${attempt + 1}/${MAX_MUTATION_RETRIES + 1}`);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
return mutated;
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
229
|
+
console.error(`[gepa] Mutation LLM call failed (attempt ${attempt + 1}/${MAX_MUTATION_RETRIES + 1}): ${msg}`);
|
|
230
|
+
if (attempt >= MAX_MUTATION_RETRIES)
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
function cleanMutationResponse(response) {
|
|
237
|
+
let cleaned = response.trim();
|
|
238
|
+
const fenceMatch = cleaned.match(/^```(?:markdown|md|text|txt)?\s*\n([\s\S]*?)\n?```\s*$/);
|
|
239
|
+
if (fenceMatch) {
|
|
240
|
+
cleaned = fenceMatch[1].trim();
|
|
241
|
+
}
|
|
242
|
+
if ((cleaned.startsWith('"') && cleaned.endsWith('"')) ||
|
|
243
|
+
(cleaned.startsWith("'") && cleaned.endsWith("'"))) {
|
|
244
|
+
cleaned = cleaned.slice(1, -1).trim();
|
|
245
|
+
}
|
|
246
|
+
return cleaned;
|
|
247
|
+
}
|
|
248
|
+
export { buildReflectionPrompt, validateConstraints, selectParent, REFLECTION_SYSTEM_PROMPT, EARLY_STOP_SCORE, STAGNATION_LIMIT, };
|
|
249
|
+
//# sourceMappingURL=optimizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../src/gepa/optimizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GEPA target definitions — what prompts/skills can be optimized.
|
|
3
|
+
*
|
|
4
|
+
* Each target knows how to load its current content, where the source lives,
|
|
5
|
+
* and what constraints must be preserved during optimization.
|
|
6
|
+
*
|
|
7
|
+
* Targets:
|
|
8
|
+
* 1. wiki-system-prompt — Wiki agent persona (templates/prompts.ts)
|
|
9
|
+
* 2. ingest-prompt — Source ingestion (templates/prompts.ts)
|
|
10
|
+
* 3. query-prompt — Search result synthesis (templates/prompts.ts)
|
|
11
|
+
* 4. capture-system-prompt — Session capture agent (templates/prompts.ts)
|
|
12
|
+
* 5. capture-prompt — Auto-capture at shutdown (templates/prompts.ts)
|
|
13
|
+
* 6. maintenance-system-prompt — Wiki maintenance agent (maintainer.ts, non-exported)
|
|
14
|
+
* 7. processor-capture-prompt — Daemon capture agent (processor.ts, non-exported)
|
|
15
|
+
* 8. skill-para — Active PARA behavioral guidelines (skills/para/SKILL.md)
|
|
16
|
+
* 9. skill-setup — Setup instructions (skills/setup/SKILL.md)
|
|
17
|
+
*/
|
|
18
|
+
import type { Target } from "./types.js";
|
|
19
|
+
/** Get the path where an optimized version of a target is saved. */
|
|
20
|
+
export declare function getOptimizedPath(name: string): string;
|
|
21
|
+
/** Get the history directory for a target. */
|
|
22
|
+
export declare function getHistoryDir(name: string): string;
|
|
23
|
+
/** Check if an optimized version exists for a target. */
|
|
24
|
+
export declare function isOptimized(name: string): Promise<boolean>;
|
|
25
|
+
/** A loaded target with its content ready. */
|
|
26
|
+
export interface LoadedTarget extends Target {
|
|
27
|
+
displayName: string;
|
|
28
|
+
filePath: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load a single target by name.
|
|
32
|
+
* @throws if target name is not recognized
|
|
33
|
+
*/
|
|
34
|
+
export declare function loadTarget(name: string): LoadedTarget;
|
|
35
|
+
/** Load all targets. */
|
|
36
|
+
export declare function listTargets(): LoadedTarget[];
|
|
37
|
+
/** Get all target names. */
|
|
38
|
+
export declare function listTargetNames(): string[];
|
|
39
|
+
//# sourceMappingURL=targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../src/gepa/targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,YAAY,CAAC;AAiBrD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,yDAAyD;AACzD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;AAgSD,8CAA8C;AAC9C,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAkBrD;AAED,wBAAwB;AACxB,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAW5C;AAED,4BAA4B;AAC5B,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GEPA target definitions — what prompts/skills can be optimized.
|
|
3
|
+
*
|
|
4
|
+
* Each target knows how to load its current content, where the source lives,
|
|
5
|
+
* and what constraints must be preserved during optimization.
|
|
6
|
+
*
|
|
7
|
+
* Targets:
|
|
8
|
+
* 1. wiki-system-prompt — Wiki agent persona (templates/prompts.ts)
|
|
9
|
+
* 2. ingest-prompt — Source ingestion (templates/prompts.ts)
|
|
10
|
+
* 3. query-prompt — Search result synthesis (templates/prompts.ts)
|
|
11
|
+
* 4. capture-system-prompt — Session capture agent (templates/prompts.ts)
|
|
12
|
+
* 5. capture-prompt — Auto-capture at shutdown (templates/prompts.ts)
|
|
13
|
+
* 6. maintenance-system-prompt — Wiki maintenance agent (maintainer.ts, non-exported)
|
|
14
|
+
* 7. processor-capture-prompt — Daemon capture agent (processor.ts, non-exported)
|
|
15
|
+
* 8. skill-para — Active PARA behavioral guidelines (skills/para/SKILL.md)
|
|
16
|
+
* 9. skill-setup — Setup instructions (skills/setup/SKILL.md)
|
|
17
|
+
*/
|
|
18
|
+
import { readFile } from "node:fs/promises";
|
|
19
|
+
import { join, dirname } from "node:path";
|
|
20
|
+
import { existsSync } from "node:fs";
|
|
21
|
+
import { homedir } from "node:os";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
// -- Path helpers ------------------------------------------------------------
|
|
24
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
25
|
+
const __dirname = dirname(__filename);
|
|
26
|
+
/** Project root (two levels up from src/gepa/ → dist/gepa/ at runtime). */
|
|
27
|
+
function getProjectRoot() {
|
|
28
|
+
// At build time: src/gepa/targets.ts → project root is ../../
|
|
29
|
+
// At runtime: dist/gepa/targets.js → project root is ../../
|
|
30
|
+
return join(__dirname, "..", "..");
|
|
31
|
+
}
|
|
32
|
+
/** Optimized prompts directory. */
|
|
33
|
+
const GEPA_DIR = join(homedir(), ".pi", "wiki", "gepa");
|
|
34
|
+
/** Get the path where an optimized version of a target is saved. */
|
|
35
|
+
export function getOptimizedPath(name) {
|
|
36
|
+
return join(GEPA_DIR, "optimized", `${name}.txt`);
|
|
37
|
+
}
|
|
38
|
+
/** Get the history directory for a target. */
|
|
39
|
+
export function getHistoryDir(name) {
|
|
40
|
+
return join(GEPA_DIR, "history", name);
|
|
41
|
+
}
|
|
42
|
+
/** Check if an optimized version exists for a target. */
|
|
43
|
+
export async function isOptimized(name) {
|
|
44
|
+
return existsSync(getOptimizedPath(name));
|
|
45
|
+
}
|
|
46
|
+
// -- Non-exported prompt extraction ------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Extract a template literal from a TypeScript source file.
|
|
49
|
+
*
|
|
50
|
+
* Finds a `const NAME = \`...\`` pattern and extracts the content.
|
|
51
|
+
* Falls back to searching the dist JS file if the TS source isn't found.
|
|
52
|
+
*/
|
|
53
|
+
async function extractTemplLiteralFromSource(filePath, varName) {
|
|
54
|
+
// Try .ts first, then .js (runtime in dist/)
|
|
55
|
+
let actualPath = filePath;
|
|
56
|
+
if (!existsSync(actualPath)) {
|
|
57
|
+
actualPath = filePath.replace(/\.ts$/, ".js");
|
|
58
|
+
}
|
|
59
|
+
if (!existsSync(actualPath)) {
|
|
60
|
+
// Try relative to project root
|
|
61
|
+
const root = getProjectRoot();
|
|
62
|
+
actualPath = join(root, "src", filePath.split("/src/").pop() ?? "");
|
|
63
|
+
if (!existsSync(actualPath)) {
|
|
64
|
+
actualPath = join(root, "dist", filePath.split("/src/").pop()?.replace(/\.ts$/, ".js") ?? "");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const source = await readFile(actualPath, "utf-8");
|
|
68
|
+
// Match: const NAME = `...`; (possibly with line-spanning content)
|
|
69
|
+
const pattern = new RegExp(`(?:const|let|var)\\s+${varName}\\s*=\\s*\`([\\s\\S]*?)\`\\s*;`);
|
|
70
|
+
const match = source.match(pattern);
|
|
71
|
+
if (!match || !match[1]) {
|
|
72
|
+
throw new Error(`[gepa] Could not extract "${varName}" from ${actualPath}. ` +
|
|
73
|
+
`Make sure the variable is defined as a template literal.`);
|
|
74
|
+
}
|
|
75
|
+
// Unescape template literal content
|
|
76
|
+
return match[1]
|
|
77
|
+
.replace(/\\`/g, "`")
|
|
78
|
+
.replace(/\\\$/g, "$")
|
|
79
|
+
.replace(/\\\\/g, "\\");
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Extract SKILL.md content, stripping YAML frontmatter.
|
|
83
|
+
*/
|
|
84
|
+
async function loadSkillContent(filePath) {
|
|
85
|
+
const raw = await readFile(filePath, "utf-8");
|
|
86
|
+
// Strip YAML frontmatter (--- ... ---)
|
|
87
|
+
const fmMatch = raw.match(/^---\s*\n[\s\S]*?\n---\s*\n/);
|
|
88
|
+
if (fmMatch) {
|
|
89
|
+
return raw.slice(fmMatch[0].length).trim();
|
|
90
|
+
}
|
|
91
|
+
return raw.trim();
|
|
92
|
+
}
|
|
93
|
+
function flattenConstraints(c) {
|
|
94
|
+
return c.requiredConcepts;
|
|
95
|
+
}
|
|
96
|
+
function buildTargets() {
|
|
97
|
+
const root = getProjectRoot();
|
|
98
|
+
return [
|
|
99
|
+
{
|
|
100
|
+
name: "wiki-system-prompt",
|
|
101
|
+
type: "prompt",
|
|
102
|
+
displayName: "Wiki System Prompt",
|
|
103
|
+
description: "System prompt for the standalone wiki agent — persona and rules for PARA wiki management",
|
|
104
|
+
filePath: join(root, "src/templates/prompts.ts"),
|
|
105
|
+
constraints: {
|
|
106
|
+
requiredConcepts: [
|
|
107
|
+
"PARA categories (resources, areas, projects, archives)",
|
|
108
|
+
"scope must be kebab-case project name",
|
|
109
|
+
"tags must be kebab-case",
|
|
110
|
+
"wikilinks to connect related pages",
|
|
111
|
+
"never include API keys or secrets",
|
|
112
|
+
"wiki summary format",
|
|
113
|
+
"index is auto-rebuilt",
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
async getContent() {
|
|
117
|
+
const { WIKI_SYSTEM_PROMPT } = await import("../templates/prompts.js");
|
|
118
|
+
return WIKI_SYSTEM_PROMPT;
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: "ingest-prompt",
|
|
123
|
+
type: "prompt",
|
|
124
|
+
displayName: "Ingest Prompt",
|
|
125
|
+
description: "Instructions for integrating new source material into the wiki",
|
|
126
|
+
filePath: join(root, "src/templates/prompts.ts"),
|
|
127
|
+
constraints: {
|
|
128
|
+
requiredConcepts: [
|
|
129
|
+
"review existing pages before creating new ones",
|
|
130
|
+
"PARA category assignment with resources as default",
|
|
131
|
+
"wiki summary format (Topic, Key Facts, Insights, Connections, Open Questions, Sources)",
|
|
132
|
+
"flag contradictions",
|
|
133
|
+
"scope must be kebab-case",
|
|
134
|
+
"wikilinks and Connections section",
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
async getContent() {
|
|
138
|
+
const { INGEST_PROMPT } = await import("../templates/prompts.js");
|
|
139
|
+
return INGEST_PROMPT;
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: "query-prompt",
|
|
144
|
+
type: "prompt",
|
|
145
|
+
displayName: "Query Prompt",
|
|
146
|
+
description: "Instructions for synthesizing answers from wiki search results",
|
|
147
|
+
filePath: join(root, "src/templates/prompts.ts"),
|
|
148
|
+
constraints: {
|
|
149
|
+
requiredConcepts: [
|
|
150
|
+
"cite specific pages using wikilink references",
|
|
151
|
+
"freshness verification",
|
|
152
|
+
"self-healing — fix incorrect wiki pages",
|
|
153
|
+
"note gaps in wiki coverage",
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
async getContent() {
|
|
157
|
+
const { QUERY_PROMPT } = await import("../templates/prompts.js");
|
|
158
|
+
return QUERY_PROMPT;
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: "capture-system-prompt",
|
|
163
|
+
type: "prompt",
|
|
164
|
+
displayName: "Capture System Prompt",
|
|
165
|
+
description: "System prompt for the standalone capture agent in templates/prompts.ts",
|
|
166
|
+
filePath: join(root, "src/templates/prompts.ts"),
|
|
167
|
+
constraints: {
|
|
168
|
+
requiredConcepts: [
|
|
169
|
+
"PARA category rules",
|
|
170
|
+
"scope must be kebab-case project name",
|
|
171
|
+
"never include API keys, tokens, passwords, or secrets",
|
|
172
|
+
"search wiki_query before creating pages",
|
|
173
|
+
"update existing pages instead of creating duplicates",
|
|
174
|
+
"wiki summary format",
|
|
175
|
+
"index is auto-rebuilt",
|
|
176
|
+
"capture architecture decisions, debugging solutions, server details, configs",
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
async getContent() {
|
|
180
|
+
const { CAPTURE_SYSTEM_PROMPT } = await import("../templates/prompts.js");
|
|
181
|
+
return CAPTURE_SYSTEM_PROMPT;
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: "capture-prompt",
|
|
186
|
+
type: "prompt",
|
|
187
|
+
displayName: "Capture Prompt",
|
|
188
|
+
description: "Prompt template for auto-capture at session shutdown",
|
|
189
|
+
filePath: join(root, "src/templates/prompts.ts"),
|
|
190
|
+
constraints: {
|
|
191
|
+
requiredConcepts: [
|
|
192
|
+
"capture ALL project-relevant knowledge",
|
|
193
|
+
"use wiki_query to search for existing pages first",
|
|
194
|
+
"prefer updating over creating",
|
|
195
|
+
"include session file path in Sources",
|
|
196
|
+
"do NOT pass indexContent",
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
async getContent() {
|
|
200
|
+
const { CAPTURE_PROMPT } = await import("../templates/prompts.js");
|
|
201
|
+
return CAPTURE_PROMPT;
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: "maintenance-system-prompt",
|
|
206
|
+
type: "prompt",
|
|
207
|
+
displayName: "Maintenance System Prompt",
|
|
208
|
+
description: "System prompt for the wiki maintenance agent (non-exported, in maintainer.ts)",
|
|
209
|
+
filePath: join(root, "src/maintainer.ts"),
|
|
210
|
+
constraints: {
|
|
211
|
+
requiredConcepts: [
|
|
212
|
+
"duplicate detection and merging",
|
|
213
|
+
"wikilink discovery",
|
|
214
|
+
"PARA category review with resources as default",
|
|
215
|
+
"tag cleanup kebab-case",
|
|
216
|
+
"content quality (Topic, Key Facts, Connections)",
|
|
217
|
+
"staleness review",
|
|
218
|
+
"project lifecycle review",
|
|
219
|
+
"conservative approach — when unsure leave it alone",
|
|
220
|
+
"never include secrets",
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
async getContent() {
|
|
224
|
+
return extractTemplLiteralFromSource(join(root, "src/maintainer.ts"), "MAINTENANCE_SYSTEM_PROMPT");
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: "processor-capture-prompt",
|
|
229
|
+
type: "prompt",
|
|
230
|
+
displayName: "Processor Capture Prompt",
|
|
231
|
+
description: "System prompt for the daemon's session capture agent (non-exported, in processor.ts)",
|
|
232
|
+
filePath: join(root, "src/processor.ts"),
|
|
233
|
+
constraints: {
|
|
234
|
+
requiredConcepts: [
|
|
235
|
+
"PARA category rules",
|
|
236
|
+
"scope must be kebab-case project name",
|
|
237
|
+
"never include API keys, tokens, passwords, or secrets",
|
|
238
|
+
"search wiki_query before creating pages",
|
|
239
|
+
"update existing pages over creating duplicates",
|
|
240
|
+
"session exploration tools (session_stats, session_search, session_slice)",
|
|
241
|
+
"wiki summary format (Topic, Key Facts, Insights, Sources)",
|
|
242
|
+
],
|
|
243
|
+
},
|
|
244
|
+
async getContent() {
|
|
245
|
+
return extractTemplLiteralFromSource(join(root, "src/processor.ts"), "CAPTURE_SYSTEM_PROMPT");
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
name: "skill-para",
|
|
250
|
+
type: "skill",
|
|
251
|
+
displayName: "PARA Skill",
|
|
252
|
+
description: "Active PARA behavioral guidelines — tells agents how to use the wiki during work",
|
|
253
|
+
filePath: join(root, "skills/para/SKILL.md"),
|
|
254
|
+
constraints: {
|
|
255
|
+
requiredConcepts: [
|
|
256
|
+
"wiki_query before planning",
|
|
257
|
+
"wiki_write for decisions and solutions",
|
|
258
|
+
"resources for almost everything",
|
|
259
|
+
"projects only for goals with end dates",
|
|
260
|
+
"scope must be kebab-case project name",
|
|
261
|
+
"wikilinks",
|
|
262
|
+
],
|
|
263
|
+
},
|
|
264
|
+
async getContent() {
|
|
265
|
+
return loadSkillContent(join(root, "skills/para/SKILL.md"));
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: "skill-setup",
|
|
270
|
+
type: "skill",
|
|
271
|
+
displayName: "Setup Skill",
|
|
272
|
+
description: "Setup instructions for pi-para — install, configure, and start",
|
|
273
|
+
filePath: join(root, "skills/setup/SKILL.md"),
|
|
274
|
+
constraints: {
|
|
275
|
+
requiredConcepts: [
|
|
276
|
+
"qmd search engine",
|
|
277
|
+
"configure providers",
|
|
278
|
+
"daemon",
|
|
279
|
+
],
|
|
280
|
+
},
|
|
281
|
+
async getContent() {
|
|
282
|
+
return loadSkillContent(join(root, "skills/setup/SKILL.md"));
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
];
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Load a single target by name.
|
|
289
|
+
* @throws if target name is not recognized
|
|
290
|
+
*/
|
|
291
|
+
export function loadTarget(name) {
|
|
292
|
+
const targets = buildTargets();
|
|
293
|
+
const def = targets.find((t) => t.name === name);
|
|
294
|
+
if (!def) {
|
|
295
|
+
const valid = targets.map((t) => t.name).join(", ");
|
|
296
|
+
throw new Error(`[gepa] Unknown target "${name}". Valid targets: ${valid}`);
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
name: def.name,
|
|
300
|
+
type: def.type,
|
|
301
|
+
displayName: def.displayName,
|
|
302
|
+
description: def.description,
|
|
303
|
+
sourcePath: def.filePath,
|
|
304
|
+
constraints: flattenConstraints(def.constraints),
|
|
305
|
+
getCurrentContent: def.getContent,
|
|
306
|
+
filePath: def.filePath,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
/** Load all targets. */
|
|
310
|
+
export function listTargets() {
|
|
311
|
+
return buildTargets().map((def) => ({
|
|
312
|
+
name: def.name,
|
|
313
|
+
type: def.type,
|
|
314
|
+
displayName: def.displayName,
|
|
315
|
+
description: def.description,
|
|
316
|
+
sourcePath: def.filePath,
|
|
317
|
+
constraints: flattenConstraints(def.constraints),
|
|
318
|
+
getCurrentContent: def.getContent,
|
|
319
|
+
filePath: def.filePath,
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
/** Get all target names. */
|
|
323
|
+
export function listTargetNames() {
|
|
324
|
+
return buildTargets().map((t) => t.name);
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=targets.js.map
|