@vimhead.dev/norn-cli 0.1.0-tip.35586725577.1 → 0.1.0-tip.35614826665.1
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/assets/README.md +1 -1
- package/assets/docs/README.md +1 -1
- package/assets/docs/composition.md +15 -0
- package/assets/docs/workflows.md +8 -2
- package/assets/examples/agent-then-analysis/plugin.ts +1 -1
- package/assets/examples/caller-owned-routing/README.md +105 -0
- package/assets/examples/caller-owned-routing/assessment.ts +22 -0
- package/assets/examples/caller-owned-routing/contracts.ts +10 -0
- package/assets/examples/caller-owned-routing/input.json +14 -0
- package/assets/examples/caller-owned-routing/norn.project.json +4 -0
- package/assets/examples/caller-owned-routing/revision.ts +20 -0
- package/assets/examples/caller-owned-routing/router.ts +49 -0
- package/assets/examples/caller-selected-continuation/producer.ts +1 -1
- package/assets/examples/coordinating-multiple-agents/plugin.ts +1 -1
- package/assets/examples/getting-started/plugin.ts +1 -1
- package/assets/examples/minimal-workflow/plugin.ts +1 -1
- package/assets/examples/shared-state/plugin.ts +1 -1
- package/assets/examples/worktree-development-loop/workflows/development-loop/execute.ts +1 -1
- package/assets/package.json +1 -1
- package/assets/packages/cli/src/generated-build-info.ts +2 -2
- package/dist/generated-build-info.d.ts +2 -2
- package/dist/generated-build-info.js +2 -2
- package/package.json +2 -2
package/assets/README.md
CHANGED
|
@@ -21,7 +21,7 @@ through the CLI from any harness. Agents run on the bundled
|
|
|
21
21
|
const summarize = workflow({
|
|
22
22
|
name: "summarize",
|
|
23
23
|
entrypoint: {
|
|
24
|
-
instructions: "
|
|
24
|
+
instructions: "Use when you need a saved summary of staged and unstaged tracked changes in a Git repository before review or handoff. Compares against HEAD, excludes untracked files, and does not edit the repository. Requires an existing commit and model access for nonempty diffs.",
|
|
25
25
|
},
|
|
26
26
|
args: Type.Object({ repositoryPath: Type.String({ minLength: 1 }) }),
|
|
27
27
|
async execute({ args, paths, commands, logs, agents, run }) {
|
package/assets/docs/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Norn capabilities are ordinary TypeScript workflows: an agent can write one duri
|
|
|
14
14
|
| Supply tools or tool wrappers to agents | [Custom tools](agents.md#custom-tools) | [Explicit shared state](../examples/shared-state/README.md) |
|
|
15
15
|
| Persist application state or coordinate concurrent mutations | [Workflow-owned storage](persistence.md#workflow-owned-storage) | [Explicit shared state](../examples/shared-state/README.md), [Example-local work queue](../examples/coordinating-multiple-agents/README.md) |
|
|
16
16
|
| Retain evidence or choose a filesystem boundary | [Persistence, files, and workspaces](persistence.md) | [Norn agent → saved file → analysis](../examples/agent-then-analysis/README.md) |
|
|
17
|
-
| Reuse
|
|
17
|
+
| Reuse workflows with caller-selected continuations and routing policy | [Composition](composition.md) | [Caller-selected continuation](../examples/caller-selected-continuation/README.md), [Caller-owned routing](../examples/caller-owned-routing/README.md) |
|
|
18
18
|
| Repair a failed run without repeating earlier work | [Recovery and gates](recovery.md) | [Analysis-only repair](../examples/agent-then-analysis/README.md#repair-only-the-analysis-step) |
|
|
19
19
|
|
|
20
20
|
[Public types](../packages/sdk/src/api.ts) define the Norn SDK's authoring interface. CLI discovery exposes the currently loaded project, not a documentation-time workflow catalogue. See [installation](../README.md#installation) for runtime setup.
|
|
@@ -70,6 +70,21 @@ Contributions must be JSON objects matching the declared input type. Object-valu
|
|
|
70
70
|
|
|
71
71
|
When passing a reference as input to another workflow, supply its JSON form shown above, not the function received in `args.next`.
|
|
72
72
|
|
|
73
|
+
## Caller-owned routing policy
|
|
74
|
+
|
|
75
|
+
A continuation can be a caller-owned router rather than the final consumer. The
|
|
76
|
+
[caller-owned routing example](../examples/caller-owned-routing/README.md) combines
|
|
77
|
+
assessment and revision workflows: assessment reports findings, revision produces
|
|
78
|
+
an updated outline, and the router owns the acceptance threshold, next action,
|
|
79
|
+
and iteration limit. Neither reusable capability knows the caller's policy.
|
|
80
|
+
|
|
81
|
+
Task-level findings and run-level completion are separate: a caller may accept
|
|
82
|
+
some findings, request more work, or fail when its revision budget is exhausted.
|
|
83
|
+
|
|
84
|
+
| Decision | GOOD | BAD |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| IF callers need different acceptance or follow-up policies, THEN supply a caller-owned router as the continuation. ELSE use a direct continuation. | Route the same assessment to completion or revision using caller thresholds. | Embed one caller's revision budget in a reusable assessment, or add a router to unconditional delivery. |
|
|
87
|
+
|
|
73
88
|
## Multiple outcomes and direct targets
|
|
74
89
|
|
|
75
90
|
References can be nested under ordinary author-selected names with independent contribution schemas:
|
package/assets/docs/workflows.md
CHANGED
|
@@ -29,7 +29,7 @@ import { Type } from "typebox";
|
|
|
29
29
|
|
|
30
30
|
export const greet = workflow({
|
|
31
31
|
name: "greet",
|
|
32
|
-
entrypoint: { instructions: "
|
|
32
|
+
entrypoint: { instructions: "Use when you need a personalized greeting returned as the run summary, without writing a file or calling a model." },
|
|
33
33
|
args: Type.Object({ name: Type.String() }),
|
|
34
34
|
execute({ args, run }) {
|
|
35
35
|
return run.complete({ summary: `Hello, ${args.name}!` });
|
|
@@ -43,7 +43,13 @@ Supply `name`, `args`, `entrypoint`, and `execute` explicitly. Use `entrypoint:
|
|
|
43
43
|
|
|
44
44
|
Workflow and scope names must be nonempty and cannot contain dots. A standalone workflow's ID is its name; a scoped workflow's ID is `<scope name>.<workflow name>`. Declarations expose the resolved `id`; CLI commands, references, and `run.next` use that exact ID, without implicit scope lookup.
|
|
45
45
|
|
|
46
|
-
`entrypoint.instructions`
|
|
46
|
+
`entrypoint.instructions` is a short capability-selection description, like a skill's short description—not an execution plan, a Norn agent system prompt, or a gate decision.
|
|
47
|
+
|
|
48
|
+
| Decision | GOOD | BAD |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| IF exposing an entrypoint, THEN lead with “Use when…” and the caller's need, followed by the useful result and only prerequisites, effects, or limits that affect selection. ELSE keep the step internal with `entrypoint: false`. | “Use when you need a source-grounded summary checked for unsupported claims. Saves a draft and an assessment; completion does not imply approval. Requires model access.” | “Call the draft agent, write JSON, then invoke the analysis workflow.” |
|
|
51
|
+
|
|
52
|
+
Declare args and config with [TypeBox schemas](schemas.md) rather than listing their fields in the description. Workflow inputs must be JSON data; `execute` receives the values after schema defaults and conversions. Public schemas must support `workflows inspect`.
|
|
47
53
|
|
|
48
54
|
Destructure the properties needed by the step from `execute(context)`. Gate descriptions receive the same inferred context:
|
|
49
55
|
|
|
@@ -24,7 +24,7 @@ const analysisSchema = Type.Object({
|
|
|
24
24
|
const scope = workflowScope({ name: "sourceSummary" });
|
|
25
25
|
export const draft = scope.workflow({
|
|
26
26
|
name: "draft",
|
|
27
|
-
entrypoint: { instructions: "
|
|
27
|
+
entrypoint: { instructions: "Use when you need a source-grounded summary checked for unsupported claims and omitted qualifications. Saves the draft and an independent assessment; a completed run may still report needs-revision. Requires model access." },
|
|
28
28
|
args: Type.Object({ source: Type.String({ minLength: 1 }) }),
|
|
29
29
|
async execute({ args, paths, agents }) {
|
|
30
30
|
const draft = await agents.prompt({
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Caller-owned routing
|
|
2
|
+
|
|
3
|
+
Combine reusable assessment and revision workflows without making either own the
|
|
4
|
+
caller's acceptance threshold or iteration limit. This code-only example checks
|
|
5
|
+
Markdown outline headings, not prose quality. No model, credentials, local
|
|
6
|
+
dependencies, or compilation step is required.
|
|
7
|
+
|
|
8
|
+
Start with [caller-selected continuation](../caller-selected-continuation/README.md)
|
|
9
|
+
for reference inputs and forwarded arguments. Here, the supplied continuation is
|
|
10
|
+
a router rather than a delivery step:
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
assessOutline → routeAssessment → complete
|
|
14
|
+
│ → fail (revision limit)
|
|
15
|
+
↓
|
|
16
|
+
appendHeading → assessOutline → routeAssessment → …
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Capability versus caller policy
|
|
20
|
+
|
|
21
|
+
- [assessment.ts](assessment.ts) reports which required headings are missing. It
|
|
22
|
+
does not decide whether those findings are acceptable or whether to revise.
|
|
23
|
+
- [revision.ts](revision.ts) appends one requested heading and contributes the
|
|
24
|
+
revised outline. It knows neither the assessment workflow nor the router.
|
|
25
|
+
- [router.ts](router.ts) owns acceptance, heading selection, the revision budget,
|
|
26
|
+
and the revision → reassessment → router chain. It saves the latest assessed
|
|
27
|
+
outline as workspace-relative `outline.md`, including on budget exhaustion.
|
|
28
|
+
- [contracts.ts](contracts.ts) declares the contribution schemas shared by callers
|
|
29
|
+
and capabilities; [norn.project.json](norn.project.json) registers all three workflows.
|
|
30
|
+
- [input.json](input.json) selects the router and captures its policy parameters
|
|
31
|
+
through `next.forwardArgs`, starting with `revisionsUsed: 0`.
|
|
32
|
+
|
|
33
|
+
The router accepts an assessment with at most `maxMissingHeadings` findings.
|
|
34
|
+
Otherwise it requests one revision, unless `maxRevisions` has been reached, in
|
|
35
|
+
which case the run fails. Acceptance is checked first: the final allowed revision
|
|
36
|
+
can still succeed. `maxRevisions` is bounded to 100 for this example.
|
|
37
|
+
|
|
38
|
+
Only the router imports both capabilities. Their `next` references could instead
|
|
39
|
+
select other registered consumers without changing either capability. The nested
|
|
40
|
+
references in the router are ordinary JSON inputs: revision contributes `outline`
|
|
41
|
+
to assessment; assessment contributes its findings back to the router. The
|
|
42
|
+
[composition reference](../../docs/composition.md) owns reference semantics.
|
|
43
|
+
|
|
44
|
+
## Inspect and run
|
|
45
|
+
|
|
46
|
+
[Select the matching runtime](../../docs/cli.md#select-the-runtime), copy this
|
|
47
|
+
entire directory into a writable task directory, and `cd` into the copy.
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
norn project inspect
|
|
51
|
+
norn workflows list --all
|
|
52
|
+
norn workflows inspect assessOutline
|
|
53
|
+
norn workflows inspect appendHeading
|
|
54
|
+
norn workflows inspect routeAssessment
|
|
55
|
+
norn runs start assessOutline < input.json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Discovery should report `isComplete: true`. Copy the returned `run.id`:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
RUN=<returned-run-id>
|
|
62
|
+
norn runs wait "$RUN"
|
|
63
|
+
norn runs inspect "$RUN"
|
|
64
|
+
norn runs checkpoints "$RUN"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Expected results:
|
|
68
|
+
|
|
69
|
+
- `run.status: completed`, `run.health: healthy`, and
|
|
70
|
+
`run.outcome.workflowId: routeAssessment`.
|
|
71
|
+
- Outcome metadata `data` contains `outlinePath: "outline.md"`,
|
|
72
|
+
`missingHeadings: []`, and `revisionsUsed: 2`.
|
|
73
|
+
- Transition checkpoints show assessment → router, then two repetitions of
|
|
74
|
+
router → revision → assessment → router.
|
|
75
|
+
|
|
76
|
+
Read `outline.md` in the inspected `run.paths.workspace`:
|
|
77
|
+
|
|
78
|
+
```markdown
|
|
79
|
+
# Release notes
|
|
80
|
+
|
|
81
|
+
## Summary
|
|
82
|
+
|
|
83
|
+
## Changes
|
|
84
|
+
|
|
85
|
+
## Verification
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
These are empty sections, not a completed release note. The example's contract is
|
|
89
|
+
heading presence only; an actual content assessment needs a different capability.
|
|
90
|
+
|
|
91
|
+
## Change only the caller's policy
|
|
92
|
+
|
|
93
|
+
For each case, edit `args.next.forwardArgs` in `input.json`, start a **new** run,
|
|
94
|
+
and inspect that run and its `outline.md`. Leave both capability modules unchanged.
|
|
95
|
+
|
|
96
|
+
| `maxMissingHeadings` | `maxRevisions` | Expected result |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| `2` | `0` | Completes immediately with two missing headings and `revisionsUsed: 0`; no revision transition. |
|
|
99
|
+
| `1` | `2` | Completes after one revision, with only `Verification` missing. |
|
|
100
|
+
| `0` | `1` | Fails in the router after one revision, with `Verification` still missing; retained outline includes `Changes`. |
|
|
101
|
+
| `0` | `0` | Fails immediately with both headings missing; no revision transition. |
|
|
102
|
+
|
|
103
|
+
Keep `revisionsUsed: 0` for each fresh run. In the failure cases, the router reports
|
|
104
|
+
that the revision limit was reached rather than completing below the requested
|
|
105
|
+
threshold. A successful `runs wait` command alone does not imply workflow success.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { workflow, workflowRefSchema } from "@vimhead.dev/norn";
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
import { assessmentContributionSchema, headingsSchema, outlineContributionSchema } from "./contracts.ts";
|
|
4
|
+
|
|
5
|
+
export const assessOutline = workflow({
|
|
6
|
+
name: "assessOutline",
|
|
7
|
+
entrypoint: {
|
|
8
|
+
instructions: "Use when you need to identify missing level-two headings in a Markdown outline before deciding whether to accept or revise it. Reports missing required headings to your continuation using exact, case-sensitive line matching; does not assess prose quality or decide acceptance.",
|
|
9
|
+
},
|
|
10
|
+
args: Type.Object({
|
|
11
|
+
...outlineContributionSchema.properties,
|
|
12
|
+
requiredHeadings: headingsSchema,
|
|
13
|
+
next: workflowRefSchema({ args: assessmentContributionSchema }),
|
|
14
|
+
}),
|
|
15
|
+
execute({ args }) {
|
|
16
|
+
const lines = new Set(args.outline.split(/\r?\n/));
|
|
17
|
+
const missingHeadings = args.requiredHeadings.filter(heading => !lines.has(`## ${heading}`));
|
|
18
|
+
return args.next({ outline: args.outline, requiredHeadings: args.requiredHeadings, missingHeadings });
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export default [assessOutline];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
|
|
3
|
+
export const headingSchema = Type.String({ minLength: 1, pattern: "^[^\\r\\n]+$" });
|
|
4
|
+
export const headingsSchema = Type.Array(headingSchema, { uniqueItems: true });
|
|
5
|
+
export const outlineContributionSchema = Type.Object({ outline: Type.String() });
|
|
6
|
+
export const assessmentContributionSchema = Type.Object({
|
|
7
|
+
...outlineContributionSchema.properties,
|
|
8
|
+
requiredHeadings: headingsSchema,
|
|
9
|
+
missingHeadings: headingsSchema,
|
|
10
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"args": {
|
|
3
|
+
"outline": "# Release notes\n\n## Summary\n",
|
|
4
|
+
"requiredHeadings": ["Summary", "Changes", "Verification"],
|
|
5
|
+
"next": {
|
|
6
|
+
"workflow": "routeAssessment",
|
|
7
|
+
"forwardArgs": {
|
|
8
|
+
"maxMissingHeadings": 0,
|
|
9
|
+
"maxRevisions": 2,
|
|
10
|
+
"revisionsUsed": 0
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { workflow, workflowRefSchema } from "@vimhead.dev/norn";
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
import { headingSchema, outlineContributionSchema } from "./contracts.ts";
|
|
4
|
+
|
|
5
|
+
export const appendHeading = workflow({
|
|
6
|
+
name: "appendHeading",
|
|
7
|
+
entrypoint: {
|
|
8
|
+
instructions: "Use when a Markdown outline needs one additional empty section before further processing. Appends the requested level-two heading and passes the revised outline to your continuation; does not write section content or assess the result.",
|
|
9
|
+
},
|
|
10
|
+
args: Type.Object({
|
|
11
|
+
...outlineContributionSchema.properties,
|
|
12
|
+
heading: headingSchema,
|
|
13
|
+
next: workflowRefSchema({ args: outlineContributionSchema }),
|
|
14
|
+
}),
|
|
15
|
+
execute({ args }) {
|
|
16
|
+
return args.next({ outline: `${args.outline.trimEnd()}\n\n## ${args.heading}\n` });
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export default [appendHeading];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { workflow, type WorkflowResult } from "@vimhead.dev/norn";
|
|
4
|
+
import { Type } from "typebox";
|
|
5
|
+
import { assessOutline } from "./assessment.ts";
|
|
6
|
+
import { assessmentContributionSchema } from "./contracts.ts";
|
|
7
|
+
import { appendHeading } from "./revision.ts";
|
|
8
|
+
|
|
9
|
+
export const routeAssessment = workflow({
|
|
10
|
+
name: "routeAssessment",
|
|
11
|
+
entrypoint: false,
|
|
12
|
+
args: Type.Object({
|
|
13
|
+
...assessmentContributionSchema.properties,
|
|
14
|
+
maxMissingHeadings: Type.Integer({ minimum: 0 }),
|
|
15
|
+
maxRevisions: Type.Integer({ minimum: 0, maximum: 100 }),
|
|
16
|
+
revisionsUsed: Type.Integer({ minimum: 0, maximum: 100 }),
|
|
17
|
+
}),
|
|
18
|
+
async execute({ args, paths, run }): Promise<WorkflowResult> {
|
|
19
|
+
const outlinePath = "outline.md";
|
|
20
|
+
await writeFile(join(paths.workspace, outlinePath), args.outline);
|
|
21
|
+
const data = { outlinePath, missingHeadings: args.missingHeadings, revisionsUsed: args.revisionsUsed };
|
|
22
|
+
if (args.missingHeadings.length <= args.maxMissingHeadings) {
|
|
23
|
+
return run.complete({ summary: "Outline meets the caller's heading threshold.", data });
|
|
24
|
+
}
|
|
25
|
+
if (args.revisionsUsed >= args.maxRevisions) {
|
|
26
|
+
return run.fail({ summary: "Revision limit reached before the outline met the caller's heading threshold.", data });
|
|
27
|
+
}
|
|
28
|
+
return appendHeading({
|
|
29
|
+
outline: args.outline,
|
|
30
|
+
heading: args.missingHeadings[0],
|
|
31
|
+
next: {
|
|
32
|
+
workflow: assessOutline.id,
|
|
33
|
+
forwardArgs: {
|
|
34
|
+
requiredHeadings: args.requiredHeadings,
|
|
35
|
+
next: {
|
|
36
|
+
workflow: routeAssessment.id,
|
|
37
|
+
forwardArgs: {
|
|
38
|
+
maxMissingHeadings: args.maxMissingHeadings,
|
|
39
|
+
maxRevisions: args.maxRevisions,
|
|
40
|
+
revisionsUsed: args.revisionsUsed + 1,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export default [routeAssessment];
|
|
@@ -11,7 +11,7 @@ export const greetingContributionSchema = Type.Object({
|
|
|
11
11
|
const scope = workflowScope({ name: "greetingProducer" });
|
|
12
12
|
export const write = scope.workflow({
|
|
13
13
|
name: "write",
|
|
14
|
-
entrypoint: { instructions: "
|
|
14
|
+
entrypoint: { instructions: "Use when a later workflow needs a personalized greeting file and should decide what happens next. Passes the workspace-relative file path and summary to your continuation instead of completing the run." },
|
|
15
15
|
args: Type.Object({
|
|
16
16
|
name: Type.String({ minLength: 1 }),
|
|
17
17
|
next: workflowRefSchema({ args: greetingContributionSchema }),
|
|
@@ -13,7 +13,7 @@ const workerReportSchema = Type.Object({ status: Type.Enum(["acknowledged", "idl
|
|
|
13
13
|
const scope = workflowScope({ name: "coordinatingAgents" });
|
|
14
14
|
export const start = scope.workflow({
|
|
15
15
|
name: "start",
|
|
16
|
-
entrypoint: { instructions: "
|
|
16
|
+
entrypoint: { instructions: "Use when you need separate summaries of 2–12 notes processed concurrently with saved progress for recovery. Saves each summary with a checked verbatim source quotation; this checks quotation fidelity, not summary quality. Requires model access." },
|
|
17
17
|
args: inputSchema,
|
|
18
18
|
async execute({ args, paths }) {
|
|
19
19
|
const queue = await openQueue({ workspace: paths.workspace, create: true });
|
|
@@ -5,7 +5,7 @@ import { Type } from "typebox";
|
|
|
5
5
|
|
|
6
6
|
export const summarize = workflow({
|
|
7
7
|
name: "summarize",
|
|
8
|
-
entrypoint: { instructions: "
|
|
8
|
+
entrypoint: { instructions: "Use when you need a saved summary of staged and unstaged tracked changes in a Git repository before review or handoff. Compares against HEAD, excludes untracked files, and does not edit the repository. Requires an existing commit and model access for nonempty diffs." },
|
|
9
9
|
args: Type.Object({ repositoryPath: Type.String({ minLength: 1 }) }),
|
|
10
10
|
async execute({ args, paths, commands, logs, agents, run }) {
|
|
11
11
|
const diff = await commands.run({
|
|
@@ -5,7 +5,7 @@ import { Type } from "typebox";
|
|
|
5
5
|
|
|
6
6
|
export const write = workflow({
|
|
7
7
|
name: "greet",
|
|
8
|
-
entrypoint: { instructions: "
|
|
8
|
+
entrypoint: { instructions: "Use when you need a personalized greeting saved as a local file with no model or external service. Completes with the greeting text and workspace-relative file path." },
|
|
9
9
|
args: Type.Object({ name: Type.Decode(Type.String({ pattern: "\\S" }), value => value.trim()) }),
|
|
10
10
|
async execute({ args, paths, run }) {
|
|
11
11
|
const greeting = `Hello, ${args.name}!`;
|
|
@@ -11,7 +11,7 @@ const copyField = { id: "copiedText", schema: Type.String() };
|
|
|
11
11
|
|
|
12
12
|
export const copy = copyScope.workflow({
|
|
13
13
|
name: "copy",
|
|
14
|
-
entrypoint: { instructions: "
|
|
14
|
+
entrypoint: { instructions: "Use when you need to exercise an agent's access to explicitly shared state by copying a short string exactly. Saves a verified copy or fails on mismatch. Requires model access; not intended as a replacement for ordinary file copying." },
|
|
15
15
|
args: Type.Object({ source: Type.String({ minLength: 1, maxLength: 500 }) }),
|
|
16
16
|
async execute({ args, paths, agents }) {
|
|
17
17
|
const state = await SharedState.open({ path: join(paths.workspace, "state.sqlite"), create: true });
|
|
@@ -6,7 +6,7 @@ import { materializeWorkspaceRepository } from "./repository.ts";
|
|
|
6
6
|
|
|
7
7
|
export const developmentLoopWorkflow = developmentLoopScope.workflow({
|
|
8
8
|
name: "developmentLoop",
|
|
9
|
-
entrypoint: { instructions: "
|
|
9
|
+
entrypoint: { instructions: "Use when you want a repository task planned, implemented, and reviewed in a separate clone with a caller approval gate. Starts from committed content and retains changes for inspection without automatically merging or pushing results back. Requires Git, Bash, and model access." },
|
|
10
10
|
args: developmentLoopArgsSchema,
|
|
11
11
|
async execute({ args, scope, paths, commands }): Promise<WorkflowResult> {
|
|
12
12
|
const repositoryPath = await materializeWorkspaceRepository({ commands, paths, repositoryRoot: scope.config.repositoryRoot, baseRef: args.baseRef });
|
package/assets/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"0.1.0-tip.
|
|
1
|
+
{"version":"0.1.0-tip.35614826665.1"}
|
|
@@ -2,8 +2,8 @@ import type { NornBuildInfo } from "./build-info.ts";
|
|
|
2
2
|
|
|
3
3
|
export const NORN_GENERATED_BUILD_INFO = {
|
|
4
4
|
"kind": "npm-registry",
|
|
5
|
-
"version": "0.1.0-tip.
|
|
6
|
-
"commit": "
|
|
5
|
+
"version": "0.1.0-tip.35614826665.1",
|
|
6
|
+
"commit": "286e68533b1d26b5afbb0cba9d75f857fb85dc53",
|
|
7
7
|
"packageSpec": "@vimhead.dev/norn-cli@tip",
|
|
8
8
|
"upgrade": {
|
|
9
9
|
"supported": false,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const NORN_GENERATED_BUILD_INFO: {
|
|
2
2
|
readonly kind: "npm-registry";
|
|
3
|
-
readonly version: "0.1.0-tip.
|
|
4
|
-
readonly commit: "
|
|
3
|
+
readonly version: "0.1.0-tip.35614826665.1";
|
|
4
|
+
readonly commit: "286e68533b1d26b5afbb0cba9d75f857fb85dc53";
|
|
5
5
|
readonly packageSpec: "@vimhead.dev/norn-cli@tip";
|
|
6
6
|
readonly upgrade: {
|
|
7
7
|
readonly supported: false;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/generated-build-info.ts
|
|
2
2
|
var NORN_GENERATED_BUILD_INFO = {
|
|
3
3
|
"kind": "npm-registry",
|
|
4
|
-
"version": "0.1.0-tip.
|
|
5
|
-
"commit": "
|
|
4
|
+
"version": "0.1.0-tip.35614826665.1",
|
|
5
|
+
"commit": "286e68533b1d26b5afbb0cba9d75f857fb85dc53",
|
|
6
6
|
"packageSpec": "@vimhead.dev/norn-cli@tip",
|
|
7
7
|
"upgrade": {
|
|
8
8
|
"supported": false,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vimhead.dev/norn-cli",
|
|
3
|
-
"version": "0.1.0-tip.
|
|
3
|
+
"version": "0.1.0-tip.35614826665.1",
|
|
4
4
|
"description": "Harness-agnostic runtime for agent-driven and code-driven workflows, built primarily for agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@earendil-works/pi-coding-agent": "0.85.1",
|
|
44
44
|
"jiti": "^2.7.0",
|
|
45
45
|
"typebox": "^1.3.34",
|
|
46
|
-
"@vimhead.dev/norn": "0.1.0-tip.
|
|
46
|
+
"@vimhead.dev/norn": "0.1.0-tip.35614826665.1"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"build": "node ../../scripts/build-package.ts"
|