@vimhead.dev/norn-cli 0.1.0-tip.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 (171) hide show
  1. package/README.md +13 -0
  2. package/assets/README.md +157 -0
  3. package/assets/docs/README.md +23 -0
  4. package/assets/docs/agents.md +64 -0
  5. package/assets/docs/cli.md +183 -0
  6. package/assets/docs/composition.md +76 -0
  7. package/assets/docs/persistence.md +56 -0
  8. package/assets/docs/projects.md +75 -0
  9. package/assets/docs/recovery.md +56 -0
  10. package/assets/docs/resources.md +61 -0
  11. package/assets/docs/workflows.md +57 -0
  12. package/assets/examples/agent-then-analysis/README.md +103 -0
  13. package/assets/examples/agent-then-analysis/input.json +5 -0
  14. package/assets/examples/agent-then-analysis/norn.project.json +4 -0
  15. package/assets/examples/agent-then-analysis/plugin.ts +89 -0
  16. package/assets/examples/coordinating-multiple-agents/README.md +56 -0
  17. package/assets/examples/coordinating-multiple-agents/input.json +10 -0
  18. package/assets/examples/coordinating-multiple-agents/norn.project.json +4 -0
  19. package/assets/examples/coordinating-multiple-agents/plugin.ts +102 -0
  20. package/assets/examples/coordinating-multiple-agents/queue-adapter.ts +52 -0
  21. package/assets/examples/coordinating-multiple-agents/work-queue.ts +153 -0
  22. package/assets/examples/minimal-workflow/README.md +71 -0
  23. package/assets/examples/minimal-workflow/norn.project.json +4 -0
  24. package/assets/examples/minimal-workflow/plugin.ts +29 -0
  25. package/assets/examples/shared-state/README.md +19 -0
  26. package/assets/examples/shared-state/input.json +1 -0
  27. package/assets/examples/shared-state/norn.project.json +4 -0
  28. package/assets/examples/shared-state/plugin.ts +47 -0
  29. package/assets/examples/worktree-development-loop/README.md +66 -0
  30. package/assets/examples/worktree-development-loop/index.ts +1 -0
  31. package/assets/examples/worktree-development-loop/manifest.ts +26 -0
  32. package/assets/examples/worktree-development-loop/norn.project.json +9 -0
  33. package/assets/examples/worktree-development-loop/plugin.ts +27 -0
  34. package/assets/examples/worktree-development-loop/shared/commands.ts +6 -0
  35. package/assets/examples/worktree-development-loop/state.ts +23 -0
  36. package/assets/examples/worktree-development-loop/workflows/development-loop/declaration.ts +8 -0
  37. package/assets/examples/worktree-development-loop/workflows/development-loop/execute.ts +18 -0
  38. package/assets/examples/worktree-development-loop/workflows/development-loop/index.ts +4 -0
  39. package/assets/examples/worktree-development-loop/workflows/development-loop/repository.ts +22 -0
  40. package/assets/examples/worktree-development-loop/workflows/development-loop/schema.ts +14 -0
  41. package/assets/examples/worktree-development-loop/workflows/implementation/declaration.ts +8 -0
  42. package/assets/examples/worktree-development-loop/workflows/implementation/execute.ts +54 -0
  43. package/assets/examples/worktree-development-loop/workflows/implementation/index.ts +3 -0
  44. package/assets/examples/worktree-development-loop/workflows/implementation/schema.ts +12 -0
  45. package/assets/examples/worktree-development-loop/workflows/planning/declaration.ts +8 -0
  46. package/assets/examples/worktree-development-loop/workflows/planning/execute.ts +28 -0
  47. package/assets/examples/worktree-development-loop/workflows/planning/index.ts +3 -0
  48. package/assets/examples/worktree-development-loop/workflows/planning/schema.ts +12 -0
  49. package/assets/examples/worktree-development-loop/workflows/review/declaration.ts +8 -0
  50. package/assets/examples/worktree-development-loop/workflows/review/execute.ts +53 -0
  51. package/assets/examples/worktree-development-loop/workflows/review/index.ts +10 -0
  52. package/assets/examples/worktree-development-loop/workflows/review/schema.ts +23 -0
  53. package/assets/examples/worktree-development-loop/workflows/review-router/declaration.ts +12 -0
  54. package/assets/examples/worktree-development-loop/workflows/review-router/execute.ts +51 -0
  55. package/assets/examples/worktree-development-loop/workflows/review-router/index.ts +3 -0
  56. package/assets/examples/worktree-development-loop/workflows/review-router/schema.ts +12 -0
  57. package/assets/package.json +1 -0
  58. package/assets/packages/cli/src/build-info.ts +36 -0
  59. package/assets/packages/cli/src/bun/cli.ts +16 -0
  60. package/assets/packages/cli/src/cli.ts +1135 -0
  61. package/assets/packages/cli/src/client.ts +167 -0
  62. package/assets/packages/cli/src/documentation-intro.ts +30 -0
  63. package/assets/packages/cli/src/documentation.ts +149 -0
  64. package/assets/packages/cli/src/generated-build-info.ts +12 -0
  65. package/assets/packages/cli/src/internal/agent-directory.ts +5 -0
  66. package/assets/packages/cli/src/internal/agent-response-tool.ts +96 -0
  67. package/assets/packages/cli/src/internal/agents.ts +365 -0
  68. package/assets/packages/cli/src/internal/artifacts.ts +26 -0
  69. package/assets/packages/cli/src/internal/commands.ts +180 -0
  70. package/assets/packages/cli/src/internal/documentation-bundle.ts +49 -0
  71. package/assets/packages/cli/src/internal/engine.ts +501 -0
  72. package/assets/packages/cli/src/internal/errors.ts +39 -0
  73. package/assets/packages/cli/src/internal/file-names.ts +3 -0
  74. package/assets/packages/cli/src/internal/launch-request.ts +94 -0
  75. package/assets/packages/cli/src/internal/logs.ts +41 -0
  76. package/assets/packages/cli/src/internal/metrics.ts +356 -0
  77. package/assets/packages/cli/src/internal/pi-assets.ts +95 -0
  78. package/assets/packages/cli/src/internal/resource-bindings.ts +35 -0
  79. package/assets/packages/cli/src/internal/run-lease.ts +158 -0
  80. package/assets/packages/cli/src/internal/run-log.ts +59 -0
  81. package/assets/packages/cli/src/internal/run-names.ts +36 -0
  82. package/assets/packages/cli/src/internal/run-resources.ts +23 -0
  83. package/assets/packages/cli/src/internal/run-state.ts +380 -0
  84. package/assets/packages/cli/src/internal/run-store.ts +323 -0
  85. package/assets/packages/cli/src/internal/run.ts +133 -0
  86. package/assets/packages/cli/src/internal/state-store.ts +75 -0
  87. package/assets/packages/cli/src/internal/usage.ts +70 -0
  88. package/assets/packages/cli/src/internal/workflow-registry.ts +176 -0
  89. package/assets/packages/cli/src/plugin-loader.ts +412 -0
  90. package/assets/packages/cli/src/resources.ts +67 -0
  91. package/assets/packages/core/src/agent-protocol.ts +1 -0
  92. package/assets/packages/core/src/atomic-files.ts +24 -0
  93. package/assets/packages/core/src/errors.ts +3 -0
  94. package/assets/packages/sdk/src/agent-resource-adapter.ts +11 -0
  95. package/assets/packages/sdk/src/api.ts +821 -0
  96. package/assets/packages/sdk/src/files.ts +136 -0
  97. package/assets/packages/sdk/src/index.ts +6 -0
  98. package/assets/packages/sdk/src/resources.ts +20 -0
  99. package/assets/packages/sdk/src/schema.ts +48 -0
  100. package/assets/packages/sdk/src/seer/config.ts +62 -0
  101. package/assets/packages/sdk/src/seer/index.ts +7 -0
  102. package/assets/packages/sdk/src/state-adapter.ts +75 -0
  103. package/assets/setup/providers.md +128 -0
  104. package/assets/setup/releases.md +76 -0
  105. package/assets/tests/workflow-ref.test.ts +113 -0
  106. package/bin/norn.mjs +10 -0
  107. package/dist/build-info.d.ts +30 -0
  108. package/dist/build-info.js +6 -0
  109. package/dist/cli.d.ts +2 -0
  110. package/dist/cli.js +1032 -0
  111. package/dist/client.d.ts +48 -0
  112. package/dist/client.js +118 -0
  113. package/dist/documentation-intro.d.ts +5 -0
  114. package/dist/documentation-intro.js +29 -0
  115. package/dist/documentation.d.ts +33 -0
  116. package/dist/documentation.js +132 -0
  117. package/dist/generated-build-info.d.ts +10 -0
  118. package/dist/generated-build-info.js +14 -0
  119. package/dist/internal/agent-directory.d.ts +4 -0
  120. package/dist/internal/agent-directory.js +8 -0
  121. package/dist/internal/agent-response-tool.d.ts +21 -0
  122. package/dist/internal/agent-response-tool.js +79 -0
  123. package/dist/internal/agents.d.ts +29 -0
  124. package/dist/internal/agents.js +336 -0
  125. package/dist/internal/artifacts.d.ts +10 -0
  126. package/dist/internal/artifacts.js +29 -0
  127. package/dist/internal/commands.d.ts +18 -0
  128. package/dist/internal/commands.js +147 -0
  129. package/dist/internal/documentation-bundle.d.ts +16 -0
  130. package/dist/internal/documentation-bundle.js +42 -0
  131. package/dist/internal/engine.d.ts +44 -0
  132. package/dist/internal/engine.js +399 -0
  133. package/dist/internal/errors.d.ts +14 -0
  134. package/dist/internal/errors.js +38 -0
  135. package/dist/internal/file-names.d.ts +1 -0
  136. package/dist/internal/file-names.js +7 -0
  137. package/dist/internal/launch-request.d.ts +33 -0
  138. package/dist/internal/launch-request.js +110 -0
  139. package/dist/internal/logs.d.ts +16 -0
  140. package/dist/internal/logs.js +38 -0
  141. package/dist/internal/metrics.d.ts +19 -0
  142. package/dist/internal/metrics.js +282 -0
  143. package/dist/internal/pi-assets.d.ts +13 -0
  144. package/dist/internal/pi-assets.js +94 -0
  145. package/dist/internal/resource-bindings.d.ts +13 -0
  146. package/dist/internal/resource-bindings.js +34 -0
  147. package/dist/internal/run-lease.d.ts +32 -0
  148. package/dist/internal/run-lease.js +166 -0
  149. package/dist/internal/run-log.d.ts +30 -0
  150. package/dist/internal/run-log.js +71 -0
  151. package/dist/internal/run-names.d.ts +1 -0
  152. package/dist/internal/run-names.js +144 -0
  153. package/dist/internal/run-resources.d.ts +6 -0
  154. package/dist/internal/run-resources.js +26 -0
  155. package/dist/internal/run-state.d.ts +95 -0
  156. package/dist/internal/run-state.js +323 -0
  157. package/dist/internal/run-store.d.ts +35 -0
  158. package/dist/internal/run-store.js +314 -0
  159. package/dist/internal/run.d.ts +51 -0
  160. package/dist/internal/run.js +101 -0
  161. package/dist/internal/state-store.d.ts +22 -0
  162. package/dist/internal/state-store.js +97 -0
  163. package/dist/internal/usage.d.ts +5 -0
  164. package/dist/internal/usage.js +70 -0
  165. package/dist/internal/workflow-registry.d.ts +35 -0
  166. package/dist/internal/workflow-registry.js +129 -0
  167. package/dist/plugin-loader.d.ts +55 -0
  168. package/dist/plugin-loader.js +353 -0
  169. package/dist/resources.d.ts +11 -0
  170. package/dist/resources.js +98 -0
  171. package/package.json +52 -0
@@ -0,0 +1,113 @@
1
+ import assert from "node:assert/strict";
2
+ import { expect, test } from "vitest";
3
+ import { z } from "zod";
4
+
5
+ import { artifactRefSchema, definePluginManifest, workflowRefSchema } from "@vimhead.dev/norn";
6
+
7
+ const target = definePluginManifest({
8
+ id: "refs", workflows: { finish: { isEntrypoint: false, params: z.object({ report: z.string() }) } },
9
+ }).workflows.finish;
10
+
11
+ for (const reference of ["refs.finish", { id: "refs.finish" }, target]) {
12
+ test(`workflow references normalize ${typeof reference === "string" ? "strings" : "kind" in reference ? "declarations" : "id objects"}`, () => {
13
+ const schema = workflowRefSchema({ params: z.object({ report: z.string() }) });
14
+ assert.deepEqual(schema.parse(reference), { workflow: "refs.finish", forwardParams: {} });
15
+ assert.deepEqual(schema.parse({ workflow: reference, forwardParams: { task: "retain" } }), {
16
+ workflow: "refs.finish", forwardParams: { task: "retain" },
17
+ });
18
+ });
19
+ }
20
+
21
+ test("required and nullable reference inputs remain required in JSON inspection", () => {
22
+ const schema = z.object({ next: workflowRefSchema().nullable() });
23
+ const inspected = z.toJSONSchema(schema, { io: "input" });
24
+ assert.deepEqual(inspected.required, ["next"]);
25
+ assert.equal(schema.safeParse({}).success, false);
26
+ assert.equal(schema.safeParse({ next: null }).success, true);
27
+ assert.equal(schema.safeParse({ next: "refs.finish" }).success, true);
28
+ expect(inspected).toHaveProperty("properties.next.anyOf.0.anyOf.0.anyOf.0.type", "string");
29
+ expect(inspected).toHaveProperty("properties.next.anyOf.0.anyOf.1.required", ["workflow", "forwardParams"]);
30
+ });
31
+
32
+ test("optional reference inputs are optional in both validation and inspection", () => {
33
+ const schema = z.object({ next: workflowRefSchema().optional() });
34
+ assert.deepEqual(schema.parse({}), {});
35
+ assert.equal(z.toJSONSchema(schema, { io: "input" }).required?.includes("next") ?? false, false);
36
+ });
37
+
38
+ test("inspection advertises contributions alongside the unchanged reference and forward-params input schema", () => {
39
+ const contributions = z.object({
40
+ records: artifactRefSchema,
41
+ count: z.string().transform(Number),
42
+ label: z.string().default("collected"),
43
+ });
44
+ const reference = workflowRefSchema({ params: contributions }).describe("Continue with the collected records");
45
+ const schema = z.object({ next: reference });
46
+ const inspected = z.toJSONSchema(schema, { io: "input" });
47
+ expect(inspected).toHaveProperty("properties.next.x-norn-workflow-ref.contributedParamsSchema", z.toJSONSchema(contributions, { io: "input" }));
48
+ expect(inspected).toHaveProperty("properties.next.description", "Continue with the collected records");
49
+ expect(inspected).toHaveProperty("properties.next.anyOf", z.toJSONSchema(workflowRefSchema(), { io: "input" }).anyOf);
50
+ expect(inspected).toHaveProperty("properties.next.anyOf.1.properties.forwardParams.type", "object");
51
+ expect(inspected).toHaveProperty("properties.next.anyOf.1.properties.forwardParams.additionalProperties", {});
52
+ expect(inspected).toHaveProperty("properties.next.anyOf.1.required", ["workflow", "forwardParams"]);
53
+ expect(inspected).toHaveProperty("properties.next.x-norn-workflow-ref.contributedParamsSchema.required", ["records", "count"]);
54
+ expect(inspected).toHaveProperty("properties.next.x-norn-workflow-ref.contributedParamsSchema.properties.count.type", "string");
55
+ const forwardParams = { taskId: "task-42", nested: { labels: ["one", "two"], enabled: false, absent: null } };
56
+ const input = { next: { workflow: "refs.finish", forwardParams } };
57
+ assert.deepEqual(schema.parse(input), input);
58
+ });
59
+
60
+ test("references without declared contributions advertise an empty contribution schema", () => {
61
+ for (const reference of [workflowRefSchema(), workflowRefSchema({ params: undefined })]) {
62
+ expect(z.toJSONSchema(reference, { io: "input" })).toHaveProperty("x-norn-workflow-ref.contributedParamsSchema", z.toJSONSchema(z.object({}), { io: "input" }));
63
+ assert.deepEqual(reference.parse("refs.finish"), { workflow: "refs.finish", forwardParams: {} });
64
+ }
65
+ });
66
+
67
+ test("optional, nullable and array references retain their contribution annotations", () => {
68
+ const reference = workflowRefSchema({ params: z.object({ report: z.string() }) });
69
+ const schema = z.object({ optional: reference.optional(), nullable: reference.nullable(), many: z.array(reference) });
70
+ const inspected = z.toJSONSchema(schema, { io: "input" });
71
+ const expected = z.toJSONSchema(z.object({ report: z.string() }), { io: "input" });
72
+ for (const path of ["properties.optional", "properties.nullable.anyOf.0", "properties.many.items"]) {
73
+ expect(inspected).toHaveProperty(`${path}.x-norn-workflow-ref.contributedParamsSchema`, expected);
74
+ }
75
+ assert.deepEqual(inspected.required, ["nullable", "many"]);
76
+ assert.deepEqual(schema.parse({ nullable: null, many: ["refs.finish"] }), { nullable: null, many: [{ workflow: "refs.finish", forwardParams: {} }] });
77
+ });
78
+
79
+ test("nested continuation schemas retain their own contribution and forwarding contracts", () => {
80
+ const finalContributions = z.object({ summary: z.string() });
81
+ const contributions = z.object({
82
+ records: artifactRefSchema,
83
+ next: workflowRefSchema({ params: finalContributions }),
84
+ });
85
+ const inspected = z.toJSONSchema(workflowRefSchema({ params: contributions }), { io: "input" });
86
+ const path = "x-norn-workflow-ref.contributedParamsSchema.properties.next";
87
+ expect(inspected).toHaveProperty(`${path}.x-norn-workflow-ref.contributedParamsSchema`, z.toJSONSchema(finalContributions, { io: "input" }));
88
+ expect(inspected).toHaveProperty(`${path}.anyOf.1.properties.forwardParams.type`, "object");
89
+ expect(inspected).toHaveProperty(`${path}.anyOf.1.properties.forwardParams.additionalProperties`, {});
90
+ });
91
+
92
+ test("lazy recursive contribution schemas are resolved during inspection, not reference construction", () => {
93
+ type Contribution = { label: string; children: Contribution[] };
94
+ let contributions: z.ZodType<Contribution>;
95
+ const lazyContributions = z.lazy(() => contributions);
96
+ const reference = workflowRefSchema({ params: lazyContributions });
97
+ contributions = z.object({ label: z.string(), children: z.array(z.lazy(() => contributions)) });
98
+ const inspected = z.toJSONSchema(reference, { io: "input" });
99
+ expect(inspected).toHaveProperty("x-norn-workflow-ref.contributedParamsSchema", z.toJSONSchema(lazyContributions, { io: "input" }));
100
+ assert.deepEqual(reference.parse("refs.finish"), { workflow: "refs.finish", forwardParams: {} });
101
+ });
102
+
103
+ test("an unrepresentable contribution schema does not change reference parsing", () => {
104
+ const reference = workflowRefSchema({ params: z.custom(() => true) });
105
+ assert.deepEqual(reference.parse("refs.finish"), { workflow: "refs.finish", forwardParams: {} });
106
+ assert.throws(() => z.toJSONSchema(reference, { io: "input" }));
107
+ });
108
+
109
+ for (const input of [undefined, null, "", 3, {}, { id: "" }, { workflow: "refs.finish" }, { workflow: "", forwardParams: {} }, { workflow: "refs.finish", forwardParams: null }]) {
110
+ test(`invalid workflow reference is rejected: ${JSON.stringify(input)}`, () => {
111
+ assert.equal(workflowRefSchema().safeParse(input).success, false);
112
+ });
113
+ }
package/bin/norn.mjs ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { homedir } from "node:os";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ process.env.PI_PACKAGE_DIR = fileURLToPath(new URL("..", import.meta.resolve("@earendil-works/pi-coding-agent")));
6
+ const { resolveNornAgentDirectory } = await import("../dist/internal/agent-directory.js");
7
+ process.env.NORN_AGENT_DIR = resolveNornAgentDirectory({ home: homedir(), environment: process.env });
8
+ process.env.PI_CODING_AGENT_DIR = process.env.NORN_AGENT_DIR;
9
+ const cli = await import("../dist/cli.js");
10
+ await cli.main(process.argv.slice(2), { kind: "local", root: fileURLToPath(new URL("../assets", import.meta.url)) });
@@ -0,0 +1,30 @@
1
+ export type NornBuildInfo = NornUnknownBuildInfo | NornNpmRegistryBuildInfo | NornGithubReleaseBinaryBuildInfo;
2
+ export type NornUnknownBuildInfo = {
3
+ readonly kind: "unknown";
4
+ readonly version: string;
5
+ readonly commit: string | null;
6
+ readonly upgrade: {
7
+ readonly supported: false;
8
+ readonly reason: string;
9
+ };
10
+ };
11
+ export type NornNpmRegistryBuildInfo = {
12
+ readonly kind: "npm-registry";
13
+ readonly version: string;
14
+ readonly commit: string | null;
15
+ readonly packageSpec: string;
16
+ readonly upgrade: {
17
+ readonly supported: false;
18
+ readonly reason: string;
19
+ };
20
+ };
21
+ export type NornGithubReleaseBinaryBuildInfo = {
22
+ readonly kind: "github-release-binary";
23
+ readonly version: string;
24
+ readonly commit: string | null;
25
+ readonly repository: string;
26
+ readonly releaseTag: string;
27
+ readonly assetName: string;
28
+ readonly checksumAssetName: string;
29
+ };
30
+ export declare const NORN_BUILD_INFO: NornBuildInfo;
@@ -0,0 +1,6 @@
1
+ // src/build-info.ts
2
+ import { NORN_GENERATED_BUILD_INFO } from "./generated-build-info.js";
3
+ var NORN_BUILD_INFO = NORN_GENERATED_BUILD_INFO;
4
+ export {
5
+ NORN_BUILD_INFO
6
+ };
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { type NornDocumentationSource } from "./documentation.ts";
2
+ export declare function main(args: readonly string[], documentationSource: NornDocumentationSource): Promise<void>;