@davidorex/pi-workflows 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/CHANGELOG.md +7 -4
  2. package/README.md +33 -7
  3. package/agents/architecture-designer.agent.yaml +58 -0
  4. package/agents/architecture-inferrer.agent.yaml +60 -0
  5. package/agents/gap-identifier.agent.yaml +66 -0
  6. package/agents/handoff-writer.agent.yaml +64 -0
  7. package/agents/plan-creator.agent.yaml +63 -0
  8. package/agents/project-definer.agent.yaml +53 -0
  9. package/agents/project-inferrer.agent.yaml +63 -0
  10. package/agents/requirements-gatherer.agent.yaml +58 -0
  11. package/dist/agent-spec.d.ts +27 -0
  12. package/dist/agent-spec.d.ts.map +1 -0
  13. package/dist/agent-spec.js +112 -0
  14. package/dist/agent-spec.js.map +1 -0
  15. package/dist/checkpoint.d.ts +50 -0
  16. package/dist/checkpoint.d.ts.map +1 -0
  17. package/dist/checkpoint.js +109 -0
  18. package/dist/checkpoint.js.map +1 -0
  19. package/dist/completion.d.ts +18 -0
  20. package/dist/completion.d.ts.map +1 -0
  21. package/dist/completion.js +58 -0
  22. package/dist/completion.js.map +1 -0
  23. package/dist/dag.d.ts +56 -0
  24. package/dist/dag.d.ts.map +1 -0
  25. package/dist/dag.js +172 -0
  26. package/dist/dag.js.map +1 -0
  27. package/dist/dispatch.d.ts +35 -0
  28. package/dist/dispatch.d.ts.map +1 -0
  29. package/dist/dispatch.js +311 -0
  30. package/dist/dispatch.js.map +1 -0
  31. package/dist/expression.d.ts +64 -0
  32. package/dist/expression.d.ts.map +1 -0
  33. package/dist/expression.js +294 -0
  34. package/dist/expression.js.map +1 -0
  35. package/dist/format.d.ts +19 -0
  36. package/dist/format.d.ts.map +1 -0
  37. package/dist/format.js +42 -0
  38. package/dist/format.js.map +1 -0
  39. package/dist/index.d.ts +8 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +675 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/output.d.ts +12 -0
  44. package/dist/output.d.ts.map +1 -0
  45. package/dist/output.js +59 -0
  46. package/dist/output.js.map +1 -0
  47. package/dist/state.d.ts +66 -0
  48. package/dist/state.d.ts.map +1 -0
  49. package/dist/state.js +227 -0
  50. package/dist/state.js.map +1 -0
  51. package/dist/step-agent.d.ts +35 -0
  52. package/dist/step-agent.d.ts.map +1 -0
  53. package/dist/step-agent.js +156 -0
  54. package/dist/step-agent.js.map +1 -0
  55. package/dist/step-command.d.ts +21 -0
  56. package/dist/step-command.d.ts.map +1 -0
  57. package/dist/step-command.js +150 -0
  58. package/dist/step-command.js.map +1 -0
  59. package/dist/step-foreach.d.ts +33 -0
  60. package/dist/step-foreach.d.ts.map +1 -0
  61. package/dist/step-foreach.js +112 -0
  62. package/dist/step-foreach.js.map +1 -0
  63. package/dist/step-gate.d.ts +18 -0
  64. package/dist/step-gate.d.ts.map +1 -0
  65. package/dist/step-gate.js +137 -0
  66. package/dist/step-gate.js.map +1 -0
  67. package/dist/step-loop.d.ts +32 -0
  68. package/dist/step-loop.d.ts.map +1 -0
  69. package/dist/step-loop.js +278 -0
  70. package/dist/step-loop.js.map +1 -0
  71. package/dist/step-monitor.d.ts +56 -0
  72. package/dist/step-monitor.d.ts.map +1 -0
  73. package/dist/step-monitor.js +317 -0
  74. package/dist/step-monitor.js.map +1 -0
  75. package/dist/step-parallel.d.ts +43 -0
  76. package/dist/step-parallel.d.ts.map +1 -0
  77. package/dist/step-parallel.js +122 -0
  78. package/dist/step-parallel.js.map +1 -0
  79. package/{src/step-pause.ts → dist/step-pause.d.ts} +3 -13
  80. package/dist/step-pause.d.ts.map +1 -0
  81. package/dist/step-pause.js +22 -0
  82. package/dist/step-pause.js.map +1 -0
  83. package/dist/step-shared.d.ts +57 -0
  84. package/dist/step-shared.d.ts.map +1 -0
  85. package/dist/step-shared.js +125 -0
  86. package/dist/step-shared.js.map +1 -0
  87. package/dist/step-transform.d.ts +11 -0
  88. package/dist/step-transform.d.ts.map +1 -0
  89. package/dist/step-transform.js +41 -0
  90. package/dist/step-transform.js.map +1 -0
  91. package/dist/template.d.ts +51 -0
  92. package/dist/template.d.ts.map +1 -0
  93. package/{src/template.ts → dist/template.js} +32 -38
  94. package/dist/template.js.map +1 -0
  95. package/dist/test-helpers.d.ts +17 -0
  96. package/dist/test-helpers.d.ts.map +1 -0
  97. package/dist/test-helpers.js +46 -0
  98. package/dist/test-helpers.js.map +1 -0
  99. package/dist/tui.d.ts +47 -0
  100. package/dist/tui.d.ts.map +1 -0
  101. package/dist/tui.js +143 -0
  102. package/dist/tui.js.map +1 -0
  103. package/dist/types.d.ts +164 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +3 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/workflow-discovery.d.ts +23 -0
  108. package/dist/workflow-discovery.d.ts.map +1 -0
  109. package/dist/workflow-discovery.js +103 -0
  110. package/dist/workflow-discovery.js.map +1 -0
  111. package/dist/workflow-executor.d.ts +50 -0
  112. package/dist/workflow-executor.d.ts.map +1 -0
  113. package/dist/workflow-executor.js +726 -0
  114. package/dist/workflow-executor.js.map +1 -0
  115. package/dist/workflow-sdk.d.ts +44 -0
  116. package/dist/workflow-sdk.d.ts.map +1 -0
  117. package/dist/workflow-sdk.js +438 -0
  118. package/dist/workflow-sdk.js.map +1 -0
  119. package/dist/workflow-spec.d.ts +33 -0
  120. package/dist/workflow-spec.d.ts.map +1 -0
  121. package/dist/workflow-spec.js +464 -0
  122. package/dist/workflow-spec.js.map +1 -0
  123. package/dist/workflows-dir.d.ts +3 -0
  124. package/dist/workflows-dir.d.ts.map +1 -0
  125. package/dist/workflows-dir.js +3 -0
  126. package/dist/workflows-dir.js.map +1 -0
  127. package/package.json +53 -38
  128. package/schemas/decomposition-specs.schema.json +48 -48
  129. package/schemas/execution-results.schema.json +48 -48
  130. package/schemas/investigation-findings.schema.json +43 -43
  131. package/schemas/pattern-analysis.schema.json +41 -41
  132. package/schemas/phase.schema.json +48 -0
  133. package/schemas/plan-breakdown.schema.json +20 -20
  134. package/schemas/quality-analysis.schema.json +33 -33
  135. package/schemas/research-findings.schema.json +42 -42
  136. package/schemas/structure-analysis.schema.json +40 -40
  137. package/schemas/synthesis.schema.json +31 -31
  138. package/schemas/verifier-output.schema.json +94 -94
  139. package/skill-narrative.md +84 -0
  140. package/skills/pi-workflows/SKILL.md +247 -0
  141. package/templates/architecture-designer/task.md +117 -0
  142. package/templates/architecture-inferrer/task.md +61 -0
  143. package/templates/gap-identifier/task.md +103 -0
  144. package/templates/handoff-writer/task.md +91 -0
  145. package/templates/plan-creator/task.md +143 -0
  146. package/templates/project-definer/task.md +67 -0
  147. package/templates/project-inferrer/task.md +56 -0
  148. package/templates/requirements-gatherer/task.md +90 -0
  149. package/workflows/analyze-existing-project.workflow.yaml +74 -0
  150. package/workflows/create-handoff.workflow.yaml +58 -0
  151. package/workflows/create-phase.workflow.yaml +1 -1
  152. package/workflows/do-gap.workflow.yaml +4 -4
  153. package/workflows/fix-audit.workflow.yaml +1 -1
  154. package/workflows/gap-to-phase.workflow.yaml +1 -1
  155. package/workflows/init-new-project.workflow.yaml +55 -0
  156. package/workflows/plan-from-requirements.workflow.yaml +51 -0
  157. package/workflows/self-implement.workflow.yaml +3 -3
  158. package/workflows/typed-analysis.workflow.yaml +4 -4
  159. package/src/agent-spec.test.ts +0 -289
  160. package/src/agent-spec.ts +0 -122
  161. package/src/block-validation.test.ts +0 -350
  162. package/src/checkpoint.test.ts +0 -237
  163. package/src/checkpoint.ts +0 -139
  164. package/src/completion.test.ts +0 -143
  165. package/src/completion.ts +0 -68
  166. package/src/dag.test.ts +0 -350
  167. package/src/dag.ts +0 -219
  168. package/src/dispatch.test.ts +0 -473
  169. package/src/dispatch.ts +0 -353
  170. package/src/expression.test.ts +0 -353
  171. package/src/expression.ts +0 -332
  172. package/src/format.test.ts +0 -80
  173. package/src/format.ts +0 -41
  174. package/src/graduated-failure.test.ts +0 -556
  175. package/src/index.test.ts +0 -114
  176. package/src/index.ts +0 -488
  177. package/src/loop.test.ts +0 -549
  178. package/src/output.test.ts +0 -213
  179. package/src/output.ts +0 -70
  180. package/src/parallel-integration.test.ts +0 -175
  181. package/src/resume.test.ts +0 -192
  182. package/src/state.test.ts +0 -192
  183. package/src/state.ts +0 -253
  184. package/src/step-agent.test.ts +0 -327
  185. package/src/step-agent.ts +0 -178
  186. package/src/step-command.test.ts +0 -330
  187. package/src/step-command.ts +0 -132
  188. package/src/step-foreach.test.ts +0 -647
  189. package/src/step-foreach.ts +0 -148
  190. package/src/step-gate.test.ts +0 -185
  191. package/src/step-gate.ts +0 -116
  192. package/src/step-loop.test.ts +0 -626
  193. package/src/step-loop.ts +0 -323
  194. package/src/step-parallel.test.ts +0 -475
  195. package/src/step-parallel.ts +0 -168
  196. package/src/step-pause.test.ts +0 -30
  197. package/src/step-shared.test.ts +0 -355
  198. package/src/step-shared.ts +0 -157
  199. package/src/step-transform.test.ts +0 -155
  200. package/src/step-transform.ts +0 -47
  201. package/src/template-integration.test.ts +0 -72
  202. package/src/template.test.ts +0 -162
  203. package/src/test-helpers.ts +0 -51
  204. package/src/tui.test.ts +0 -355
  205. package/src/tui.ts +0 -182
  206. package/src/types.ts +0 -195
  207. package/src/verifier-schema.test.ts +0 -226
  208. package/src/workflow-discovery.test.ts +0 -105
  209. package/src/workflow-discovery.ts +0 -113
  210. package/src/workflow-executor.test.ts +0 -1530
  211. package/src/workflow-executor.ts +0 -810
  212. package/src/workflow-sdk.test.ts +0 -238
  213. package/src/workflow-sdk.ts +0 -262
  214. package/src/workflow-spec.test.ts +0 -576
  215. package/src/workflow-spec.ts +0 -471
@@ -1,105 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import assert from "node:assert";
3
- import { discoverWorkflows, findWorkflow } from "./workflow-discovery.ts";
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import os from "node:os";
7
-
8
- // Use a nonexistent dir as builtinDir so tests don't pick up real demo workflows
9
- const NO_BUILTINS = path.join(os.tmpdir(), "wf-no-builtins-nonexistent");
10
-
11
- describe("discoverWorkflows", () => {
12
- it("discovers workflows from project directory", () => {
13
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "wf-test-"));
14
- const wfDir = path.join(tmpDir, ".pi", "workflows");
15
- fs.mkdirSync(wfDir, { recursive: true });
16
- fs.writeFileSync(
17
- path.join(wfDir, "test.workflow.yaml"),
18
- "name: test\nsteps:\n s:\n agent: a",
19
- );
20
-
21
- const specs = discoverWorkflows(tmpDir, NO_BUILTINS);
22
- assert.strictEqual(specs.length, 1);
23
- assert.strictEqual(specs[0].name, "test");
24
- assert.strictEqual(specs[0].source, "project");
25
-
26
- fs.rmSync(tmpDir, { recursive: true });
27
- });
28
-
29
- it("returns empty array when no workflow directories exist", () => {
30
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "wf-test-"));
31
- const specs = discoverWorkflows(tmpDir, NO_BUILTINS);
32
- assert.strictEqual(specs.length, 0);
33
- fs.rmSync(tmpDir, { recursive: true });
34
- });
35
-
36
- it("skips invalid specs with warning (no throw)", () => {
37
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "wf-test-"));
38
- const wfDir = path.join(tmpDir, ".pi", "workflows");
39
- fs.mkdirSync(wfDir, { recursive: true });
40
- fs.writeFileSync(path.join(wfDir, "bad.workflow.yaml"), "not: valid: workflow");
41
- fs.writeFileSync(
42
- path.join(wfDir, "good.workflow.yaml"),
43
- "name: good\nsteps:\n s:\n agent: a",
44
- );
45
-
46
- const specs = discoverWorkflows(tmpDir, NO_BUILTINS);
47
- assert.strictEqual(specs.length, 1);
48
- assert.strictEqual(specs[0].name, "good");
49
-
50
- fs.rmSync(tmpDir, { recursive: true });
51
- });
52
-
53
- it("project specs shadow user specs with same name", () => {
54
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "wf-test-"));
55
- const projectDir = path.join(tmpDir, ".pi", "workflows");
56
- fs.mkdirSync(projectDir, { recursive: true });
57
- fs.writeFileSync(
58
- path.join(projectDir, "shared.workflow.yaml"),
59
- "name: shared\ndescription: project version\nsteps:\n s:\n agent: a",
60
- );
61
-
62
- const specs = discoverWorkflows(tmpDir, NO_BUILTINS);
63
- assert.strictEqual(specs.length, 1);
64
- assert.strictEqual(specs[0].source, "project");
65
-
66
- fs.rmSync(tmpDir, { recursive: true });
67
- });
68
-
69
- it("discovers builtin demo workflows", () => {
70
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "wf-test-"));
71
- const demoDir = path.resolve(import.meta.dirname, "..", "workflows");
72
-
73
- const specs = discoverWorkflows(tmpDir, demoDir);
74
- assert.ok(specs.length > 0, "should find at least one demo workflow");
75
-
76
- const names = specs.map((s) => s.name);
77
- assert.ok(names.includes("typed-analysis"), "should find typed-analysis demo");
78
-
79
- fs.rmSync(tmpDir, { recursive: true });
80
- });
81
- });
82
-
83
- describe("findWorkflow", () => {
84
- it("finds a workflow by name", () => {
85
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "wf-test-"));
86
- const wfDir = path.join(tmpDir, ".pi", "workflows");
87
- fs.mkdirSync(wfDir, { recursive: true });
88
- fs.writeFileSync(
89
- path.join(wfDir, "bugfix.workflow.yaml"),
90
- "name: bugfix\nsteps:\n s:\n agent: a",
91
- );
92
-
93
- const spec = findWorkflow("bugfix", tmpDir, NO_BUILTINS);
94
- assert.ok(spec);
95
- assert.strictEqual(spec.name, "bugfix");
96
-
97
- fs.rmSync(tmpDir, { recursive: true });
98
- });
99
-
100
- it("returns undefined for unknown workflow", () => {
101
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "wf-test-"));
102
- assert.strictEqual(findWorkflow("nonexistent", tmpDir, NO_BUILTINS), undefined);
103
- fs.rmSync(tmpDir, { recursive: true });
104
- });
105
- });
@@ -1,113 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import os from "node:os";
4
- import type { WorkflowSpec } from "./types.ts";
5
- import { parseWorkflowSpec } from "./workflow-spec.ts";
6
-
7
- /**
8
- * Discover all workflow specs from project, user, and builtin directories.
9
- *
10
- * Scans (highest priority first):
11
- * 1. .pi/workflows/ (project-level, source: "project")
12
- * 2. ~/.pi/agent/workflows/ (user-level, source: "user")
13
- * 3. <package>/workflows/ (builtin workflows, source: "user")
14
- *
15
- * Higher-priority specs shadow lower-priority specs with the same name.
16
- *
17
- * @param cwd - current working directory (project root)
18
- * @param builtinDir - optional path to builtin workflows (defaults to workflows/ relative to package root)
19
- * @returns Array of parsed WorkflowSpec objects. Specs that fail parsing are
20
- * skipped with a warning (logged to stderr), not thrown.
21
- */
22
- export function discoverWorkflows(cwd: string, builtinDir?: string): WorkflowSpec[] {
23
- const projectDir = path.join(cwd, ".pi", "workflows");
24
- const userDir = path.join(os.homedir(), ".pi", "agent", "workflows");
25
- const demoDir = builtinDir ?? path.resolve(import.meta.dirname, "..", "workflows");
26
-
27
- const projectSpecs = scanDirectory(projectDir, "project");
28
- const userSpecs = scanDirectory(userDir, "user");
29
- const builtinSpecs = scanDirectory(demoDir, "user");
30
-
31
- // Deduplicate: project > user > builtin (last write wins, so add lowest priority first)
32
- const byName = new Map<string, WorkflowSpec>();
33
-
34
- for (const spec of builtinSpecs) {
35
- byName.set(spec.name, spec);
36
- }
37
- for (const spec of userSpecs) {
38
- byName.set(spec.name, spec);
39
- }
40
- for (const spec of projectSpecs) {
41
- byName.set(spec.name, spec);
42
- }
43
-
44
- // Return sorted by name
45
- const result = Array.from(byName.values());
46
- result.sort((a, b) => a.name.localeCompare(b.name));
47
- return result;
48
- }
49
-
50
- /**
51
- * Find a workflow by name from discovered workflows.
52
- * Returns undefined if not found.
53
- */
54
- export function findWorkflow(name: string, cwd: string, builtinDir?: string): WorkflowSpec | undefined {
55
- const specs = discoverWorkflows(cwd, builtinDir);
56
- return specs.find((s) => s.name === name);
57
- }
58
-
59
- /**
60
- * Scan a directory for *.workflow.yaml files and parse them.
61
- * Non-recursive. Returns parsed specs; logs warnings for parse failures.
62
- */
63
- function scanDirectory(dirPath: string, source: "user" | "project"): WorkflowSpec[] {
64
- if (!fs.existsSync(dirPath)) {
65
- return [];
66
- }
67
-
68
- let entries: string[];
69
- try {
70
- entries = fs.readdirSync(dirPath);
71
- } catch {
72
- return [];
73
- }
74
-
75
- const specs: WorkflowSpec[] = [];
76
-
77
- for (const entry of entries) {
78
- if (!entry.endsWith(".workflow.yaml")) {
79
- continue;
80
- }
81
-
82
- const filePath = path.join(dirPath, entry);
83
-
84
- // Only process files, not directories
85
- let stat: fs.Stats;
86
- try {
87
- stat = fs.statSync(filePath);
88
- } catch {
89
- continue;
90
- }
91
- if (!stat.isFile()) {
92
- continue;
93
- }
94
-
95
- let content: string;
96
- try {
97
- content = fs.readFileSync(filePath, "utf-8");
98
- } catch {
99
- console.error(`[pi-workflows] Warning: skipping ${filePath}: could not read file`);
100
- continue;
101
- }
102
-
103
- try {
104
- const spec = parseWorkflowSpec(content, filePath, source);
105
- specs.push(spec);
106
- } catch (err) {
107
- const msg = err instanceof Error ? err.message : String(err);
108
- console.error(`[pi-workflows] Warning: skipping ${filePath}: ${msg}`);
109
- }
110
- }
111
-
112
- return specs;
113
- }