@vimhead.dev/norn-cli 0.1.0-tip.35611592848.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 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: "Summarize staged and unstaged tracked changes relative to HEAD in an absolute repositoryPath. Requires Git and an existing commit; untracked files are excluded. Saves workspace-relative summaryPath and retains the diff log. A nonempty diff is sent to the configured model; an empty diff needs no model call.",
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 }) {
@@ -29,7 +29,7 @@ import { Type } from "typebox";
29
29
 
30
30
  export const greet = workflow({
31
31
  name: "greet",
32
- entrypoint: { instructions: "Return a greeting for the supplied name." },
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` describe selection, inputs, effects, and outputs. They are neither a Norn agent system prompt nor a gate decision. Declare args and config with [TypeBox schemas](schemas.md). Workflow inputs must be JSON data; `execute` receives the values after schema defaults and conversions. Public schemas must support `workflows inspect`.
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: "Summarize a supplied source, save the draft, and independently assess its support and omissions. Returns workspace-relative draftPath and analysisPath plus an assessment; needs-revision is a completed assessment, not an approved summary." },
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({
@@ -5,7 +5,7 @@ import { assessmentContributionSchema, headingsSchema, outlineContributionSchema
5
5
  export const assessOutline = workflow({
6
6
  name: "assessOutline",
7
7
  entrypoint: {
8
- instructions: "Check an outline for exact, case-sensitive '## heading' lines from requiredHeadings. Pass outline, requiredHeadings, and missingHeadings to the caller-selected next workflow. Reports heading presence only, not content quality; no model or external service is used.",
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
9
  },
10
10
  args: Type.Object({
11
11
  ...outlineContributionSchema.properties,
@@ -5,7 +5,7 @@ import { headingSchema, outlineContributionSchema } from "./contracts.ts";
5
5
  export const appendHeading = workflow({
6
6
  name: "appendHeading",
7
7
  entrypoint: {
8
- instructions: "Append one empty level-two Markdown section named heading to outline, then pass the revised outline to the caller-selected next workflow. Does not assess the outline or select further work; no model or external service is used.",
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
9
  },
10
10
  args: Type.Object({
11
11
  ...outlineContributionSchema.properties,
@@ -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: "Write a greeting file for name, then invoke the caller-selected next workflow with workspace-relative resultPath and summary. The continuation owns completion; no model or external service is used." },
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: "Summarize 2–12 supplied notes using two concurrent Norn agents and a shared leased work queue. Checkpoint completed rounds, verify every persisted result and exact source quotation, and return workspace-relative summariesPath for summaries.json. Requires configured Norn agent authentication; modifies only this run's logs and workspace." },
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: "Summarize staged and unstaged tracked changes relative to HEAD in an absolute repositoryPath. Requires Git and an existing commit; untracked files are excluded. Saves workspace-relative summaryPath and retains the diff log. A nonempty diff is sent to the configured model; an empty diff needs no model call." },
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: "Write a greeting file for the supplied name. Returns the greeting text and its workspace-relative greetingPath; no agent or external service is used." },
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: "A Norn agent reads explicitly shared source and writes a copy, then a separate workflow verifies exact equality from a workspace SQLite database." },
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: "Plan once, then loop implementation and review in a workspace repository copy. Call this when a repository task should run through planning, implementation, and review." },
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 });
@@ -1 +1 @@
1
- {"version":"0.1.0-tip.35611592848.1"}
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.35611592848.1",
6
- "commit": "ece526887ef7a821f5e08062d1553e8a5273bd86",
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.35611592848.1";
4
- readonly commit: "ece526887ef7a821f5e08062d1553e8a5273bd86";
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.35611592848.1",
5
- "commit": "ece526887ef7a821f5e08062d1553e8a5273bd86",
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.35611592848.1",
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.35611592848.1"
46
+ "@vimhead.dev/norn": "0.1.0-tip.35614826665.1"
47
47
  },
48
48
  "scripts": {
49
49
  "build": "node ../../scripts/build-package.ts"