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.
Files changed (88) hide show
  1. package/dist/bin/poe-agent.js +1 -1
  2. package/dist/cli/commands/dashboard-loop-shared.d.ts +2 -11
  3. package/dist/cli/commands/dashboard-loop-shared.js +2 -10
  4. package/dist/cli/commands/dashboard-loop-shared.js.map +1 -1
  5. package/dist/cli/commands/memory.d.ts +3 -0
  6. package/dist/cli/commands/memory.js +181 -0
  7. package/dist/cli/commands/memory.js.map +1 -0
  8. package/dist/cli/commands/pipeline-init.d.ts +17 -0
  9. package/dist/cli/commands/pipeline-init.js +166 -0
  10. package/dist/cli/commands/pipeline-init.js.map +1 -0
  11. package/dist/cli/commands/pipeline.js +132 -1
  12. package/dist/cli/commands/pipeline.js.map +1 -1
  13. package/dist/cli/commands/plan.d.ts +1 -0
  14. package/dist/cli/commands/plan.js +1 -1
  15. package/dist/cli/commands/plan.js.map +1 -1
  16. package/dist/cli/poe-agent-main.d.ts +10 -1
  17. package/dist/cli/poe-agent-main.js +89 -47
  18. package/dist/cli/poe-agent-main.js.map +1 -1
  19. package/dist/cli/program.js +5 -0
  20. package/dist/cli/program.js.map +1 -1
  21. package/dist/corpus/001-archaeoastronomy.md +479 -0
  22. package/dist/corpus/002-magnetohydrodynamics.md +475 -0
  23. package/dist/corpus/003-biosemiotics.md +483 -0
  24. package/dist/corpus/004-cryopedology.md +483 -0
  25. package/dist/corpus/005-geomicrobiology.md +479 -0
  26. package/dist/corpus/006-aeronomy.md +487 -0
  27. package/dist/corpus/007-paleoclimatology.md +479 -0
  28. package/dist/corpus/008-hydrogeophysics.md +479 -0
  29. package/dist/corpus/009-magnetostratigraphy.md +475 -0
  30. package/dist/corpus/010-isotope-hydrology.md +481 -0
  31. package/dist/corpus/011-speleothem-geochemistry.md +474 -0
  32. package/dist/corpus/012-astrobiogeochemistry.md +475 -0
  33. package/dist/corpus/013-neuroethology.md +483 -0
  34. package/dist/corpus/014-chronophysiology.md +483 -0
  35. package/dist/corpus/015-limnogeochemistry.md +475 -0
  36. package/dist/corpus/016-palynology.md +483 -0
  37. package/dist/corpus/017-volcanotectonics.md +473 -0
  38. package/dist/corpus/018-seismotectonics.md +473 -0
  39. package/dist/corpus/019-biogeomorphology.md +475 -0
  40. package/dist/corpus/020-geobiophysics.md +479 -0
  41. package/dist/corpus/021-phytolith-analysis.md +481 -0
  42. package/dist/corpus/022-archaeometallurgy.md +479 -0
  43. package/dist/corpus/023-paleomagnetism.md +479 -0
  44. package/dist/corpus/024-biocalorimetry.md +475 -0
  45. package/dist/corpus/025-atmospheric-chemiluminescence.md +473 -0
  46. package/dist/corpus/026-cryoseismology.md +479 -0
  47. package/dist/corpus/027-extremophile-radiobiology.md +475 -0
  48. package/dist/corpus/028-heliophysics.md +479 -0
  49. package/dist/corpus/029-astroparticle-geophysics.md +474 -0
  50. package/dist/corpus/030-glaciohydrology.md +479 -0
  51. package/dist/corpus/031-permafrost-microbiology.md +477 -0
  52. package/dist/corpus/032-ecoacoustics.md +479 -0
  53. package/dist/corpus/033-dendroclimatology.md +473 -0
  54. package/dist/corpus/034-ionospheric-tomography.md +477 -0
  55. package/dist/corpus/035-marine-geodesy.md +481 -0
  56. package/dist/corpus/036-sedimentary-ancient-dna.md +481 -0
  57. package/dist/corpus/037-myrmecochory-dynamics.md +474 -0
  58. package/dist/corpus/038-chemosensory-ecology.md +477 -0
  59. package/dist/corpus/039-spintronics-materials.md +479 -0
  60. package/dist/corpus/040-nanotoxicology.md +483 -0
  61. package/dist/corpus/041-cosmochemistry.md +483 -0
  62. package/dist/corpus/042-quaternary-geochronology.md +471 -0
  63. package/dist/corpus/043-biophotonics.md +479 -0
  64. package/dist/corpus/044-evolutionary-morphometrics.md +481 -0
  65. package/dist/corpus/045-cryovolcanology.md +475 -0
  66. package/dist/corpus/046-exoplanet-atmospheric-dynamics.md +479 -0
  67. package/dist/corpus/047-microbial-electrosynthesis.md +477 -0
  68. package/dist/corpus/048-paleoseismology.md +479 -0
  69. package/dist/corpus/049-actinide-geochemistry.md +477 -0
  70. package/dist/corpus/050-quantum-biology.md +489 -0
  71. package/dist/index.d.ts +2 -2
  72. package/dist/index.js +22300 -19185
  73. package/dist/index.js.map +4 -4
  74. package/dist/providers/poe-agent.js +3683 -1859
  75. package/dist/providers/poe-agent.js.map +4 -4
  76. package/dist/sdk/pipeline.d.ts +27 -0
  77. package/dist/sdk/pipeline.js +91 -1
  78. package/dist/sdk/pipeline.js.map +1 -1
  79. package/dist/services/config.d.ts +30 -1
  80. package/dist/services/config.js +11 -0
  81. package/dist/services/config.js.map +1 -1
  82. package/package.json +4 -1
  83. package/packages/design-system/dist/dashboard/index.d.ts +1 -0
  84. package/packages/design-system/dist/dashboard/index.js +1 -0
  85. package/packages/design-system/dist/dashboard/should-use-dashboard.d.ts +10 -0
  86. package/packages/design-system/dist/dashboard/should-use-dashboard.js +7 -0
  87. package/packages/design-system/dist/index.d.ts +1 -1
  88. package/packages/design-system/dist/index.js +1 -1
@@ -6,4 +6,4 @@ if (_major < 18) {
6
6
  );
7
7
  process.exit(1);
8
8
  }
9
- import("../index.js").then(function (m) { m.poeAgentMain(); }).catch(function (err) { console.error(err); process.exit(1); })
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 { resolveOutputFormat } from "@poe-code/design-system";
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":"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"}
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,3 @@
1
+ import type { Command } from "commander";
2
+ import type { CliContainer } from "../container.js";
3
+ export declare function registerMemoryCommand(program: Command, container: CliContainer): void;
@@ -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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE5E,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9F,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACjF,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CACvB,wEAAwE,CACzE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,SAAuB;IAC7E,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uCAAuC,CAAC;SACpD,oBAAoB,EAAE;SACtB,MAAM,CAAC;QACN,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,oBAAoB,CAAC;gBACnB,SAAS;gBACT,KAAK,EAAE,KAAK;gBACZ,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;gBACrC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAC9B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEtC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;YACzB,OAAO,EAAE,yBAAyB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;YAC1E,GAAG,EAAE,8BAA8B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;SAC5E,CAAC,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAC5F,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yBAAyB,CAAC;SACtC,QAAQ,CAAC,QAAQ,EAAE,uCAAuC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,KAAK,IAAI;gBACd,MAAM,IAAI,KAAK;gBACf,KAAK,CAAC,IAAI,KAAK,QAAQ,EACvB,CAAC;gBACD,MAAM,IAAI,eAAe,CAAC,mBAAmB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2CAA2C,CAAC;SACxD,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,aAAa,EAAE,8BAA8B,CAAC;SACrD,MAAM,CAAC,KAAK;QACX,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAuB,CAAC;QAEjD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;gBAClD,CAAC,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBACxC,CAAC,CAAC,IAAI,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB,MAAM,CAAC,YAAY,aAAa,MAAM,CAAC,YAAY,WAAW,KAAK,IAAI,CAC1F,CAAC;YACF,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,eAAe,CAAC;gBACpB,OAAO,EAAE,mCAAmC;aAC7C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;YACzB,OAAO,EAAE,iBAAiB;YAC1B,GAAG,EAAE,qBAAqB;SAC3B,CAAC,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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.")