poe-code 3.0.182 → 3.0.183
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/dist/bin/poe-agent.js +1 -1
- package/dist/cli/commands/dashboard-loop-shared.d.ts +2 -11
- package/dist/cli/commands/dashboard-loop-shared.js +2 -10
- package/dist/cli/commands/dashboard-loop-shared.js.map +1 -1
- package/dist/cli/commands/memory.d.ts +3 -0
- package/dist/cli/commands/memory.js +181 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/pipeline-init.d.ts +17 -0
- package/dist/cli/commands/pipeline-init.js +166 -0
- package/dist/cli/commands/pipeline-init.js.map +1 -0
- package/dist/cli/commands/pipeline.js +132 -1
- package/dist/cli/commands/pipeline.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +1 -0
- package/dist/cli/commands/plan.js +1 -1
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/poe-agent-main.d.ts +10 -1
- package/dist/cli/poe-agent-main.js +89 -47
- package/dist/cli/poe-agent-main.js.map +1 -1
- package/dist/cli/program.js +5 -0
- package/dist/cli/program.js.map +1 -1
- package/dist/corpus/001-archaeoastronomy.md +479 -0
- package/dist/corpus/002-magnetohydrodynamics.md +475 -0
- package/dist/corpus/003-biosemiotics.md +483 -0
- package/dist/corpus/004-cryopedology.md +483 -0
- package/dist/corpus/005-geomicrobiology.md +479 -0
- package/dist/corpus/006-aeronomy.md +487 -0
- package/dist/corpus/007-paleoclimatology.md +479 -0
- package/dist/corpus/008-hydrogeophysics.md +479 -0
- package/dist/corpus/009-magnetostratigraphy.md +475 -0
- package/dist/corpus/010-isotope-hydrology.md +481 -0
- package/dist/corpus/011-speleothem-geochemistry.md +474 -0
- package/dist/corpus/012-astrobiogeochemistry.md +475 -0
- package/dist/corpus/013-neuroethology.md +483 -0
- package/dist/corpus/014-chronophysiology.md +483 -0
- package/dist/corpus/015-limnogeochemistry.md +475 -0
- package/dist/corpus/016-palynology.md +483 -0
- package/dist/corpus/017-volcanotectonics.md +473 -0
- package/dist/corpus/018-seismotectonics.md +473 -0
- package/dist/corpus/019-biogeomorphology.md +475 -0
- package/dist/corpus/020-geobiophysics.md +479 -0
- package/dist/corpus/021-phytolith-analysis.md +481 -0
- package/dist/corpus/022-archaeometallurgy.md +479 -0
- package/dist/corpus/023-paleomagnetism.md +479 -0
- package/dist/corpus/024-biocalorimetry.md +475 -0
- package/dist/corpus/025-atmospheric-chemiluminescence.md +473 -0
- package/dist/corpus/026-cryoseismology.md +479 -0
- package/dist/corpus/027-extremophile-radiobiology.md +475 -0
- package/dist/corpus/028-heliophysics.md +479 -0
- package/dist/corpus/029-astroparticle-geophysics.md +474 -0
- package/dist/corpus/030-glaciohydrology.md +479 -0
- package/dist/corpus/031-permafrost-microbiology.md +477 -0
- package/dist/corpus/032-ecoacoustics.md +479 -0
- package/dist/corpus/033-dendroclimatology.md +473 -0
- package/dist/corpus/034-ionospheric-tomography.md +477 -0
- package/dist/corpus/035-marine-geodesy.md +481 -0
- package/dist/corpus/036-sedimentary-ancient-dna.md +481 -0
- package/dist/corpus/037-myrmecochory-dynamics.md +474 -0
- package/dist/corpus/038-chemosensory-ecology.md +477 -0
- package/dist/corpus/039-spintronics-materials.md +479 -0
- package/dist/corpus/040-nanotoxicology.md +483 -0
- package/dist/corpus/041-cosmochemistry.md +483 -0
- package/dist/corpus/042-quaternary-geochronology.md +471 -0
- package/dist/corpus/043-biophotonics.md +479 -0
- package/dist/corpus/044-evolutionary-morphometrics.md +481 -0
- package/dist/corpus/045-cryovolcanology.md +475 -0
- package/dist/corpus/046-exoplanet-atmospheric-dynamics.md +479 -0
- package/dist/corpus/047-microbial-electrosynthesis.md +477 -0
- package/dist/corpus/048-paleoseismology.md +479 -0
- package/dist/corpus/049-actinide-geochemistry.md +477 -0
- package/dist/corpus/050-quantum-biology.md +489 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +22300 -19185
- package/dist/index.js.map +4 -4
- package/dist/providers/poe-agent.js +3683 -1859
- package/dist/providers/poe-agent.js.map +4 -4
- package/dist/sdk/pipeline.d.ts +27 -0
- package/dist/sdk/pipeline.js +91 -1
- package/dist/sdk/pipeline.js.map +1 -1
- package/dist/services/config.d.ts +30 -1
- package/dist/services/config.js +11 -0
- package/dist/services/config.js.map +1 -1
- package/package.json +4 -1
- package/packages/design-system/dist/dashboard/index.d.ts +1 -0
- package/packages/design-system/dist/dashboard/index.js +1 -0
- package/packages/design-system/dist/dashboard/should-use-dashboard.d.ts +10 -0
- package/packages/design-system/dist/dashboard/should-use-dashboard.js +7 -0
- package/packages/design-system/dist/index.d.ts +1 -1
- package/packages/design-system/dist/index.js +1 -1
package/dist/bin/poe-agent.js
CHANGED
|
@@ -6,4 +6,4 @@ if (_major < 18) {
|
|
|
6
6
|
);
|
|
7
7
|
process.exit(1);
|
|
8
8
|
}
|
|
9
|
-
import("../
|
|
9
|
+
import("../cli/poe-agent-main.js").then(function (m) { m.poeAgentMain(); }).catch(function (err) { console.error(err); process.exit(1); })
|
|
@@ -1,23 +1,14 @@
|
|
|
1
|
-
import { type Dashboard } from "@poe-code/design-system";
|
|
2
|
-
type DashboardIo = {
|
|
3
|
-
stdin: {
|
|
4
|
-
isTTY?: boolean | undefined;
|
|
5
|
-
};
|
|
6
|
-
stdout: {
|
|
7
|
-
isTTY?: boolean | undefined;
|
|
8
|
-
};
|
|
9
|
-
};
|
|
1
|
+
import { shouldUseInteractiveDashboard, type Dashboard } from "@poe-code/design-system";
|
|
10
2
|
type DashboardQuitCommandOptions = {
|
|
11
3
|
abortController: AbortController;
|
|
12
4
|
dashboard: Pick<Dashboard, "destroy" | "onCommand" | "stop">;
|
|
13
5
|
requestCancellation: () => void;
|
|
14
6
|
};
|
|
7
|
+
export { shouldUseInteractiveDashboard };
|
|
15
8
|
export declare function formatDashboardDuration(ms: number): string;
|
|
16
9
|
export declare function formatDashboardTimestamp(timestamp: number): string;
|
|
17
10
|
export declare function createDashboardLineBuffer(emit: (line: string) => void): {
|
|
18
11
|
push(chunk: string): void;
|
|
19
12
|
flush(): void;
|
|
20
13
|
};
|
|
21
|
-
export declare function shouldUseInteractiveDashboard(enabled: boolean | undefined, io?: DashboardIo): boolean;
|
|
22
14
|
export declare function registerDashboardQuitCommands(options: DashboardQuitCommandOptions): void;
|
|
23
|
-
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { shouldUseInteractiveDashboard } from "@poe-code/design-system";
|
|
2
|
+
export { shouldUseInteractiveDashboard };
|
|
2
3
|
export function formatDashboardDuration(ms) {
|
|
3
4
|
const totalSeconds = Math.round(ms / 1000);
|
|
4
5
|
const minutes = Math.floor(totalSeconds / 60);
|
|
@@ -36,15 +37,6 @@ export function createDashboardLineBuffer(emit) {
|
|
|
36
37
|
}
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
|
-
export function shouldUseInteractiveDashboard(enabled, io = {
|
|
40
|
-
stdin: process.stdin,
|
|
41
|
-
stdout: process.stdout
|
|
42
|
-
}) {
|
|
43
|
-
return enabled === true
|
|
44
|
-
&& resolveOutputFormat() === "terminal"
|
|
45
|
-
&& Boolean(io.stdin.isTTY)
|
|
46
|
-
&& Boolean(io.stdout.isTTY);
|
|
47
|
-
}
|
|
48
40
|
export function registerDashboardQuitCommands(options) {
|
|
49
41
|
options.dashboard.onCommand((command) => {
|
|
50
42
|
if (command === "quit") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-loop-shared.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard-loop-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dashboard-loop-shared.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard-loop-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import { confirmOrCancel } from "@poe-code/design-system";
|
|
4
|
+
import { clearMemory, computeTokenStats, initMemory, listPages, resolveMemoryRoot, searchMemory, statusOf } from "@poe-code/memory";
|
|
5
|
+
import { throwCommandNotFound } from "../command-not-found.js";
|
|
6
|
+
import { ValidationError } from "../errors.js";
|
|
7
|
+
import { createExecutionResources, resolveCommandFlags } from "./shared.js";
|
|
8
|
+
function resolvePageRelPath(input) {
|
|
9
|
+
const trimmed = input.trim();
|
|
10
|
+
if (trimmed.length === 0) {
|
|
11
|
+
throw new ValidationError("Missing page path.");
|
|
12
|
+
}
|
|
13
|
+
const normalized = trimmed.replaceAll("\\", "/");
|
|
14
|
+
const withExt = path.posix.extname(normalized).length === 0 ? `${normalized}.md` : normalized;
|
|
15
|
+
return withExt.startsWith("pages/") ? withExt : `pages/${withExt}`;
|
|
16
|
+
}
|
|
17
|
+
function displayPageRelPath(relPath) {
|
|
18
|
+
return relPath.startsWith("pages/") ? relPath.slice("pages/".length) : relPath;
|
|
19
|
+
}
|
|
20
|
+
async function assertInitialized(root) {
|
|
21
|
+
const status = await statusOf(root);
|
|
22
|
+
if (!status.initialized) {
|
|
23
|
+
throw new ValidationError(`Memory is not initialized. Run "poe-code memory init" in this project.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function registerMemoryCommand(program, container) {
|
|
27
|
+
const memory = program
|
|
28
|
+
.command("memory")
|
|
29
|
+
.description("Persistent memory directory commands.")
|
|
30
|
+
.allowExcessArguments()
|
|
31
|
+
.action(function () {
|
|
32
|
+
if (this.args.length > 0) {
|
|
33
|
+
throwCommandNotFound({
|
|
34
|
+
container,
|
|
35
|
+
scope: "cli",
|
|
36
|
+
unknownCommand: this.args.at(0) ?? "",
|
|
37
|
+
helpArgs: ["memory", "--help"],
|
|
38
|
+
moduleUrl: import.meta.url
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
this.help();
|
|
42
|
+
});
|
|
43
|
+
memory
|
|
44
|
+
.command("init")
|
|
45
|
+
.description("Create .poe-code/memory/ with empty INDEX.md and LOG.md.")
|
|
46
|
+
.action(async () => {
|
|
47
|
+
const flags = resolveCommandFlags(program);
|
|
48
|
+
const resources = createExecutionResources(container, flags, "memory:init");
|
|
49
|
+
const root = resolveMemoryRoot(container.env.cwd);
|
|
50
|
+
resources.logger.intro("memory init");
|
|
51
|
+
if (flags.dryRun) {
|
|
52
|
+
resources.logger.dryRun(`Would initialize memory at ${root}`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
await initMemory(root);
|
|
56
|
+
resources.context.complete({
|
|
57
|
+
success: `Initialized memory at ${path.relative(container.env.cwd, root)}`,
|
|
58
|
+
dry: `Would initialize memory at ${path.relative(container.env.cwd, root)}`
|
|
59
|
+
});
|
|
60
|
+
resources.context.finalize();
|
|
61
|
+
});
|
|
62
|
+
memory
|
|
63
|
+
.command("ls")
|
|
64
|
+
.description("List every page with a one-line description.")
|
|
65
|
+
.action(async () => {
|
|
66
|
+
const flags = resolveCommandFlags(program);
|
|
67
|
+
const resources = createExecutionResources(container, flags, "memory:ls");
|
|
68
|
+
const root = resolveMemoryRoot(container.env.cwd);
|
|
69
|
+
resources.logger.intro("memory ls");
|
|
70
|
+
await assertInitialized(root);
|
|
71
|
+
const pages = await listPages(root);
|
|
72
|
+
if (pages.length === 0) {
|
|
73
|
+
process.stdout.write("No memory pages yet.\n");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
for (const page of pages) {
|
|
77
|
+
const description = page.frontmatter.description?.trim() ?? "";
|
|
78
|
+
process.stdout.write(`${displayPageRelPath(page.relPath)}${description.length > 0 ? ` — ${description}` : ""}\n`);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
memory
|
|
82
|
+
.command("show")
|
|
83
|
+
.description("Print a page to stdout.")
|
|
84
|
+
.argument("<path>", "Page path (relative to memory pages/)")
|
|
85
|
+
.action(async (pagePath) => {
|
|
86
|
+
const flags = resolveCommandFlags(program);
|
|
87
|
+
const resources = createExecutionResources(container, flags, "memory:show");
|
|
88
|
+
const root = resolveMemoryRoot(container.env.cwd);
|
|
89
|
+
resources.logger.intro("memory show");
|
|
90
|
+
await assertInitialized(root);
|
|
91
|
+
const relPath = resolvePageRelPath(pagePath);
|
|
92
|
+
const absPath = path.join(root, relPath);
|
|
93
|
+
try {
|
|
94
|
+
const content = await fs.readFile(absPath, "utf8");
|
|
95
|
+
process.stdout.write(content.endsWith("\n") ? content : `${content}\n`);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (typeof error === "object" &&
|
|
99
|
+
error !== null &&
|
|
100
|
+
"code" in error &&
|
|
101
|
+
error.code === "ENOENT") {
|
|
102
|
+
throw new ValidationError(`Page not found: ${displayPageRelPath(relPath)}`);
|
|
103
|
+
}
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
memory
|
|
108
|
+
.command("search")
|
|
109
|
+
.description("Search over memory files for a substring.")
|
|
110
|
+
.argument("<query>", "Search query")
|
|
111
|
+
.action(async (query) => {
|
|
112
|
+
const flags = resolveCommandFlags(program);
|
|
113
|
+
const resources = createExecutionResources(container, flags, "memory:search");
|
|
114
|
+
const root = resolveMemoryRoot(container.env.cwd);
|
|
115
|
+
resources.logger.intro("memory search");
|
|
116
|
+
await assertInitialized(root);
|
|
117
|
+
const hits = await searchMemory(root, query);
|
|
118
|
+
if (hits.length === 0) {
|
|
119
|
+
process.stdout.write("No matches.\n");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
for (const hit of hits) {
|
|
123
|
+
const displayPath = displayPageRelPath(hit.relPath);
|
|
124
|
+
process.stdout.write(`${displayPath}:${hit.lineNumber}: ${hit.line}\n`);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
memory
|
|
128
|
+
.command("status")
|
|
129
|
+
.description("Show memory status.")
|
|
130
|
+
.option("--no-tokens", "Skip token stats calculation")
|
|
131
|
+
.action(async function () {
|
|
132
|
+
const flags = resolveCommandFlags(program);
|
|
133
|
+
const resources = createExecutionResources(container, flags, "memory:status");
|
|
134
|
+
const root = resolveMemoryRoot(container.env.cwd);
|
|
135
|
+
const options = this.opts();
|
|
136
|
+
resources.logger.intro("memory status");
|
|
137
|
+
await assertInitialized(root);
|
|
138
|
+
const status = await statusOf(root);
|
|
139
|
+
process.stdout.write(`Pages: ${status.pageCount}\n`);
|
|
140
|
+
process.stdout.write(`Bytes: ${status.totalBytes}\n`);
|
|
141
|
+
if (status.lastWriteAt) {
|
|
142
|
+
process.stdout.write(`Last write: ${status.lastWriteAt}\n`);
|
|
143
|
+
}
|
|
144
|
+
if (options.tokens) {
|
|
145
|
+
const tokens = await computeTokenStats(root);
|
|
146
|
+
const ratio = Number.isFinite(tokens.reductionRatio)
|
|
147
|
+
? `${tokens.reductionRatio.toFixed(2)}×`
|
|
148
|
+
: "0×";
|
|
149
|
+
process.stdout.write(`Tokens: memory=${tokens.memoryTokens}, sources=${tokens.sourceTokens}, ratio=${ratio}\n`);
|
|
150
|
+
if (tokens.missingSources.length > 0) {
|
|
151
|
+
process.stdout.write(`Missing sources: ${tokens.missingSources.join(", ")}\n`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
memory
|
|
156
|
+
.command("clear")
|
|
157
|
+
.description("Delete all memory content and re-initialize INDEX.md and LOG.md.")
|
|
158
|
+
.action(async () => {
|
|
159
|
+
const flags = resolveCommandFlags(program);
|
|
160
|
+
const resources = createExecutionResources(container, flags, "memory:clear");
|
|
161
|
+
const root = resolveMemoryRoot(container.env.cwd);
|
|
162
|
+
resources.logger.intro("memory clear");
|
|
163
|
+
await assertInitialized(root);
|
|
164
|
+
if (!flags.assumeYes) {
|
|
165
|
+
await confirmOrCancel({
|
|
166
|
+
message: "Clear all memory pages and cache?"
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
if (flags.dryRun) {
|
|
170
|
+
resources.logger.dryRun(`Would clear memory at ${root}`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
await clearMemory(root);
|
|
174
|
+
resources.context.complete({
|
|
175
|
+
success: "Cleared memory.",
|
|
176
|
+
dry: "Would clear memory."
|
|
177
|
+
});
|
|
178
|
+
resources.context.finalize();
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/commands/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CliContainer } from "../container.js";
|
|
2
|
+
export interface BuildPipelineInitPromptOptions {
|
|
3
|
+
question?: string;
|
|
4
|
+
planDirectory: string;
|
|
5
|
+
sourceDocPath: string;
|
|
6
|
+
sourceDocContent: string;
|
|
7
|
+
skillContent: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PipelineInitSource {
|
|
10
|
+
absolutePath: string;
|
|
11
|
+
relativePath: string;
|
|
12
|
+
title: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildPipelineInitPrompt(options: BuildPipelineInitPromptOptions): string;
|
|
15
|
+
export declare function discoverPipelineInitSources(options: {
|
|
16
|
+
container: CliContainer;
|
|
17
|
+
}): Promise<PipelineInitSource[]>;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readMergedDocument, resolveScope } from "@poe-code/poe-code-config";
|
|
3
|
+
import { resolveWorkflowPath } from "@poe-code/agent-kit";
|
|
4
|
+
import { resolvePlanDirectory as resolvePipelinePlanDirectory } from "@poe-code/pipeline";
|
|
5
|
+
import { pipelineConfigScope } from "../../services/config.js";
|
|
6
|
+
import { resolvePlanDirectory as resolveSourcePlanDirectory } from "./plan.js";
|
|
7
|
+
export function buildPipelineInitPrompt(options) {
|
|
8
|
+
const trimmedQuestion = options.question?.trim() ?? "";
|
|
9
|
+
const sourceTitle = extractTitle(options.sourceDocPath, options.sourceDocContent);
|
|
10
|
+
const userRequest = trimmedQuestion.length > 0
|
|
11
|
+
? trimmedQuestion
|
|
12
|
+
: `Create a pipeline plan for "${sourceTitle}" based on the source document below. Treat the source document as the user request and do not ask the user for more input.`;
|
|
13
|
+
const fence = createMarkdownFence(options.sourceDocContent);
|
|
14
|
+
return [
|
|
15
|
+
"Follow the skill below to initialize a pipeline plan from an existing source document.",
|
|
16
|
+
"",
|
|
17
|
+
options.skillContent,
|
|
18
|
+
"",
|
|
19
|
+
"---",
|
|
20
|
+
"",
|
|
21
|
+
`Plan directory: ${options.planDirectory}`,
|
|
22
|
+
"",
|
|
23
|
+
"User request:",
|
|
24
|
+
userRequest,
|
|
25
|
+
"",
|
|
26
|
+
"Source document:",
|
|
27
|
+
`Path: ${options.sourceDocPath}`,
|
|
28
|
+
`${fence}markdown`,
|
|
29
|
+
options.sourceDocContent,
|
|
30
|
+
fence
|
|
31
|
+
].join("\n");
|
|
32
|
+
}
|
|
33
|
+
export async function discoverPipelineInitSources(options) {
|
|
34
|
+
const sourcePlanDirectory = await resolveSourcePlanDirectory(options.container);
|
|
35
|
+
const sourceAbsoluteDirectory = resolveWorkflowPath(sourcePlanDirectory, options.container.env.cwd, options.container.env.homeDir);
|
|
36
|
+
const pipelineAbsoluteDirectory = await resolveConfiguredPipelinePlanDirectory(options.container);
|
|
37
|
+
const existingPlanNames = await discoverExistingPipelinePlanNames(options.container.fs, pipelineAbsoluteDirectory);
|
|
38
|
+
const sourceFiles = await discoverMarkdownFiles(options.container.fs, sourceAbsoluteDirectory);
|
|
39
|
+
const sources = [];
|
|
40
|
+
for (const file of sourceFiles) {
|
|
41
|
+
const sourceName = path.basename(file.relativePath, path.extname(file.relativePath));
|
|
42
|
+
if (existingPlanNames.has(`plan-${sourceName}`)) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const content = await options.container.fs.readFile(file.absolutePath, "utf8");
|
|
46
|
+
sources.push({
|
|
47
|
+
absolutePath: file.absolutePath,
|
|
48
|
+
relativePath: file.relativePath,
|
|
49
|
+
title: extractTitle(file.absolutePath, content)
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return sources.sort((left, right) => left.relativePath.localeCompare(right.relativePath));
|
|
53
|
+
}
|
|
54
|
+
async function resolveConfiguredPipelinePlanDirectory(container) {
|
|
55
|
+
const document = await readMergedDocument(container.fs, container.env.configPath, container.env.projectConfigPath);
|
|
56
|
+
const config = resolveScope(pipelineConfigScope.schema, document[pipelineConfigScope.scope], container.env.variables);
|
|
57
|
+
const planDirectory = config.plan_directory?.trim();
|
|
58
|
+
return resolvePipelinePlanDirectory({
|
|
59
|
+
cwd: container.env.cwd,
|
|
60
|
+
homeDir: container.env.homeDir,
|
|
61
|
+
...(planDirectory ? { planDirectory } : {})
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async function discoverExistingPipelinePlanNames(fs, absoluteDirectory) {
|
|
65
|
+
let entries;
|
|
66
|
+
try {
|
|
67
|
+
entries = await fs.readdir(absoluteDirectory);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (isMissingDirectory(error)) {
|
|
71
|
+
return new Set();
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
const planNames = new Set();
|
|
76
|
+
for (const entry of [...entries].sort((left, right) => left.localeCompare(right))) {
|
|
77
|
+
const lower = entry.toLowerCase();
|
|
78
|
+
if (!lower.startsWith("plan-")) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (!lower.endsWith(".md") && !lower.endsWith(".yaml")) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const absolutePath = path.join(absoluteDirectory, entry);
|
|
85
|
+
const stat = await fs.stat(absolutePath);
|
|
86
|
+
if (!stat.isFile()) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
planNames.add(path.basename(entry, path.extname(entry)));
|
|
90
|
+
}
|
|
91
|
+
return planNames;
|
|
92
|
+
}
|
|
93
|
+
async function discoverMarkdownFiles(fs, absoluteDirectory, parentRelativePath = "") {
|
|
94
|
+
let entries;
|
|
95
|
+
try {
|
|
96
|
+
entries = await fs.readdir(absoluteDirectory);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (isMissingDirectory(error)) {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
const markdownFiles = [];
|
|
105
|
+
for (const entry of [...entries].sort((left, right) => left.localeCompare(right))) {
|
|
106
|
+
const absolutePath = path.join(absoluteDirectory, entry);
|
|
107
|
+
const relativePath = parentRelativePath.length > 0
|
|
108
|
+
? path.join(parentRelativePath, entry)
|
|
109
|
+
: entry;
|
|
110
|
+
const stat = await fs.stat(absolutePath);
|
|
111
|
+
if (stat.isDirectory()) {
|
|
112
|
+
if (entry === "archive") {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
markdownFiles.push(...await discoverMarkdownFiles(fs, absolutePath, relativePath));
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (!stat.isFile() || !entry.toLowerCase().endsWith(".md")) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
markdownFiles.push({
|
|
122
|
+
absolutePath,
|
|
123
|
+
relativePath
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return markdownFiles;
|
|
127
|
+
}
|
|
128
|
+
function extractTitle(filePath, content) {
|
|
129
|
+
for (const line of content.split("\n")) {
|
|
130
|
+
const trimmed = line.trim();
|
|
131
|
+
if (!trimmed.startsWith("# ")) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const title = trimmed.slice(2).trim();
|
|
135
|
+
if (title.length > 0) {
|
|
136
|
+
return title;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return path.basename(filePath, path.extname(filePath));
|
|
140
|
+
}
|
|
141
|
+
function createMarkdownFence(content) {
|
|
142
|
+
return "`".repeat(Math.max(3, longestBacktickRun(content) + 1));
|
|
143
|
+
}
|
|
144
|
+
function longestBacktickRun(content) {
|
|
145
|
+
let longest = 0;
|
|
146
|
+
let current = 0;
|
|
147
|
+
for (const char of content) {
|
|
148
|
+
if (char === "`") {
|
|
149
|
+
current += 1;
|
|
150
|
+
if (current > longest) {
|
|
151
|
+
longest = current;
|
|
152
|
+
}
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
current = 0;
|
|
156
|
+
}
|
|
157
|
+
return longest;
|
|
158
|
+
}
|
|
159
|
+
function isMissingDirectory(error) {
|
|
160
|
+
if (!error || typeof error !== "object" || !("code" in error)) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const code = error.code;
|
|
164
|
+
return code === "ENOENT" || code === "ENOTDIR";
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=pipeline-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-init.js","sourceRoot":"","sources":["../../../src/cli/commands/pipeline-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,9 @@ import { installSkill, resolveAgentSupport, supportedAgents } from "@poe-code/ag
|
|
|
8
8
|
import { readMergedDocument, resolveScope } from "@poe-code/poe-code-config";
|
|
9
9
|
import { pipelineConfigScope, planConfigScope } from "../../services/config.js";
|
|
10
10
|
import { ValidationError } from "../errors.js";
|
|
11
|
+
import { discoverPipelineInitSources } from "./pipeline-init.js";
|
|
11
12
|
import { createExecutionResources, resolveCommandFlags, resolveDefaultAgent } from "./shared.js";
|
|
12
|
-
import { runPipeline as sdkRunPipeline } from "../../sdk/pipeline.js";
|
|
13
|
+
import { runPipelineInit as sdkRunPipelineInit, runPipeline as sdkRunPipeline } from "../../sdk/pipeline.js";
|
|
13
14
|
import { spawn as sdkSpawn } from "../../sdk/spawn.js";
|
|
14
15
|
import { buildExecutionPrompt, interpolate, loadResolvedSteps, parsePlan, resolveAbsolutePlanPath, resolveFileIncludes, resolvePlanDirectory, resolvePlanPaths } from "@poe-code/pipeline";
|
|
15
16
|
import { createDashboardLineBuffer, formatDashboardDuration, formatDashboardTimestamp, registerDashboardQuitCommands, shouldUseInteractiveDashboard } from "./dashboard-loop-shared.js";
|
|
@@ -47,6 +48,18 @@ function resolveMaxRuns(value) {
|
|
|
47
48
|
}
|
|
48
49
|
return parsed;
|
|
49
50
|
}
|
|
51
|
+
function resolvePipelineInitSourcePath(container, sourcePath) {
|
|
52
|
+
const absolutePath = sourcePath.startsWith("~/")
|
|
53
|
+
? path.join(container.env.homeDir, sourcePath.slice(2))
|
|
54
|
+
: path.isAbsolute(sourcePath)
|
|
55
|
+
? sourcePath
|
|
56
|
+
: path.resolve(container.env.cwd, sourcePath);
|
|
57
|
+
return {
|
|
58
|
+
absolutePath,
|
|
59
|
+
relativePath: sourcePath,
|
|
60
|
+
title: path.basename(sourcePath, path.extname(sourcePath))
|
|
61
|
+
};
|
|
62
|
+
}
|
|
50
63
|
function formatRunSummary(result) {
|
|
51
64
|
const metrics = result.metrics;
|
|
52
65
|
return [
|
|
@@ -589,6 +602,124 @@ export function registerPipelineCommand(program, container) {
|
|
|
589
602
|
resources.context.finalize();
|
|
590
603
|
}
|
|
591
604
|
});
|
|
605
|
+
pipeline
|
|
606
|
+
.command("init")
|
|
607
|
+
.description("Initialize pipeline plans from source Markdown docs.")
|
|
608
|
+
.argument("[question]", "Optional user question to forward to the plan generator")
|
|
609
|
+
.option("--agent <name>", "Agent to generate the plan with")
|
|
610
|
+
.option("--model <model>", "Model override passed to the agent")
|
|
611
|
+
.option("--source <path>", "Single source Markdown doc to convert")
|
|
612
|
+
.option("--sources <paths...>", "Multiple source Markdown docs to convert")
|
|
613
|
+
.action(async function (question) {
|
|
614
|
+
const flags = resolveCommandFlags(program);
|
|
615
|
+
const resources = createExecutionResources(container, flags, "pipeline:init");
|
|
616
|
+
const options = this.opts();
|
|
617
|
+
resources.logger.intro("pipeline init");
|
|
618
|
+
try {
|
|
619
|
+
let sourcePaths = options.sources;
|
|
620
|
+
let resolvedQuestion = question;
|
|
621
|
+
if (!resolvedQuestion && sourcePaths && sourcePaths.length > 0) {
|
|
622
|
+
const trailingArgument = sourcePaths[sourcePaths.length - 1];
|
|
623
|
+
if (trailingArgument && !trailingArgument.toLowerCase().endsWith(".md")) {
|
|
624
|
+
resolvedQuestion = trailingArgument;
|
|
625
|
+
sourcePaths = sourcePaths.slice(0, -1);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
let agent;
|
|
629
|
+
if (options.agent) {
|
|
630
|
+
agent = resolvePipelineAgent(options.agent);
|
|
631
|
+
}
|
|
632
|
+
else if (flags.assumeYes) {
|
|
633
|
+
agent = DEFAULT_PIPELINE_AGENT;
|
|
634
|
+
}
|
|
635
|
+
else {
|
|
636
|
+
const selected = await select({
|
|
637
|
+
message: "Select agent to generate pipeline plans with:",
|
|
638
|
+
options: supportedAgents.map((value) => ({
|
|
639
|
+
value,
|
|
640
|
+
label: value
|
|
641
|
+
}))
|
|
642
|
+
});
|
|
643
|
+
if (isCancel(selected)) {
|
|
644
|
+
cancel("Pipeline init cancelled.");
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
agent = resolvePipelineAgent(selected);
|
|
648
|
+
}
|
|
649
|
+
const commandConfig = await resolvePipelineCommandConfig(container);
|
|
650
|
+
if (options.source && sourcePaths && sourcePaths.length > 0) {
|
|
651
|
+
throw new ValidationError("Use either --source or --sources, not both.");
|
|
652
|
+
}
|
|
653
|
+
let sources;
|
|
654
|
+
if (options.source) {
|
|
655
|
+
sources = [resolvePipelineInitSourcePath(container, options.source)];
|
|
656
|
+
}
|
|
657
|
+
else if (sourcePaths && sourcePaths.length > 0) {
|
|
658
|
+
sources = sourcePaths.map((sourcePath) => resolvePipelineInitSourcePath(container, sourcePath));
|
|
659
|
+
}
|
|
660
|
+
else {
|
|
661
|
+
if (flags.assumeYes) {
|
|
662
|
+
throw new ValidationError("Provide --source or --sources when using --yes.");
|
|
663
|
+
}
|
|
664
|
+
const discoveredSources = await discoverPipelineInitSources({ container });
|
|
665
|
+
if (discoveredSources.length === 0) {
|
|
666
|
+
resources.logger.info("No source documents available to initialize.");
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
const selected = await multiselect({
|
|
670
|
+
message: "Select source Markdown docs to convert:",
|
|
671
|
+
options: discoveredSources.map((source) => ({
|
|
672
|
+
value: source.relativePath,
|
|
673
|
+
label: `${source.title} (${source.relativePath})`
|
|
674
|
+
})),
|
|
675
|
+
required: true
|
|
676
|
+
});
|
|
677
|
+
if (isCancel(selected)) {
|
|
678
|
+
cancel("Pipeline init cancelled.");
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
const selectedSourcePaths = Array.isArray(selected)
|
|
682
|
+
? new Set(selected)
|
|
683
|
+
: new Set();
|
|
684
|
+
sources = discoveredSources.filter((source) => selectedSourcePaths.has(source.relativePath));
|
|
685
|
+
if (sources.length === 0) {
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
const result = await sdkRunPipelineInit({
|
|
690
|
+
agent,
|
|
691
|
+
cwd: container.env.cwd,
|
|
692
|
+
homeDir: container.env.homeDir,
|
|
693
|
+
...(commandConfig.planDirectory ? { planDirectory: commandConfig.planDirectory } : {}),
|
|
694
|
+
...(options.model ? { model: options.model } : {}),
|
|
695
|
+
...(resolvedQuestion ? { question: resolvedQuestion } : {}),
|
|
696
|
+
sources,
|
|
697
|
+
assumeYes: flags.assumeYes,
|
|
698
|
+
onSourceStart(source, index, total) {
|
|
699
|
+
resources.logger.info(`Source ${index}/${total}: ${source.relativePath}`);
|
|
700
|
+
},
|
|
701
|
+
onSourceComplete(source, index, total) {
|
|
702
|
+
resources.logger.success(`Completed ${index}/${total}: ${source.relativePath}`);
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
if (result.stopReason === "failed") {
|
|
706
|
+
process.exitCode = 1;
|
|
707
|
+
resources.logger.error(result.failedSource
|
|
708
|
+
? `Pipeline init failed at ${result.failedSource}.`
|
|
709
|
+
: "Pipeline init failed.");
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
if (result.stopReason === "cancelled") {
|
|
713
|
+
process.exitCode = 130;
|
|
714
|
+
resources.logger.warn("Pipeline init cancelled.");
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
resources.logger.success("Pipeline init finished.");
|
|
718
|
+
}
|
|
719
|
+
finally {
|
|
720
|
+
resources.context.finalize();
|
|
721
|
+
}
|
|
722
|
+
});
|
|
592
723
|
pipeline
|
|
593
724
|
.command("validate")
|
|
594
725
|
.description("Validate a pipeline plan markdown file without running it.")
|