Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1b8f327259 | |||
| 2c4700c49f | |||
| dd77b40f6c | |||
| 5ed6f68e4b | |||
| 1ed0bf1f76 |
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: expand bootstrap prompt with full onboarding and upgrade guide
|
|
||||||
|
|
||||||
Bootstrap now covers two scenarios:
|
|
||||||
- Fresh install: CLI + adapter installation, `uwf setup` configuration, skill installation, end-to-end verification
|
|
||||||
- Upgrade: package update, skill regeneration, breaking change migrations (e.g. $START new/resume)
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: bootstrap adds Step 0 environment pre-flight check
|
|
||||||
|
|
||||||
- Pre-flight checks for node, pnpm/npm, global bin PATH, hermes CLI with FIX instructions (#112)
|
|
||||||
- Install commands changed from npm to pnpm (with npm fallback)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": patch
|
|
||||||
"@united-workforce/util": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: workflow-authoring flat schema example uses enum, bootstrap adds PATH guidance
|
|
||||||
|
|
||||||
- workflow-authoring: flat schema example uses `enum: [done]` instead of bare `const` (#110.3)
|
|
||||||
- bootstrap: adds `which hermes` check and PATH guidance for venv installs (#110.4)
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: improve bootstrap docs — agent discovery, pnpm/npm parity, preset provider table (#118, #120)
|
|
||||||
|
|
||||||
- Step 1: detect installed agents (hermes/claude) before choosing adapter
|
|
||||||
- Step 1: clarify adapter versions are independent from CLI — install @latest
|
|
||||||
- Step 1: show pnpm and npm side-by-side
|
|
||||||
- Step 1: add "adapter must be installed before `uwf setup --agent`" note
|
|
||||||
- Step 1: add ACP verification step (hermes acp --help)
|
|
||||||
- Step 2: `--agent` takes adapter command name (e.g. `uwf-hermes`), not npm package
|
|
||||||
- Step 2: preset providers listed as a table with names and default base URLs
|
|
||||||
- Remove uwf-builtin from supported adapters (not ready yet)
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: preset provider base-url auto-fill, bootstrap ACP docs, friendlier name mismatch error
|
|
||||||
|
|
||||||
- `uwf setup --provider dashscope` now auto-fills `--base-url` from preset list (#106)
|
|
||||||
- Bootstrap guide documents uwf-hermes ACP dependency (`pip install hermes-agent[acp]`) (#107)
|
|
||||||
- Bootstrap verify step uses inline workflow instead of missing `examples/eval-simple.yaml` (#107)
|
|
||||||
- Workflow filename mismatch error now suggests how to fix it (#108)
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
"@united-workforce/agent-hermes": patch
|
||||||
|
"@united-workforce/agent-claude-code": patch
|
||||||
|
"@united-workforce/util-agent": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
feat: inject thread progress into agent prompt (#127)
|
||||||
|
|
||||||
|
Agents now receive a "Thread Progress" section in their prompt showing the
|
||||||
|
current step number and how many times the current role has spoken before.
|
||||||
|
This eliminates the need for agents to make tool calls (terminal, delegate_task)
|
||||||
|
just to count their own turn history.
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": patch
|
|
||||||
"@united-workforce/agent-hermes": patch
|
|
||||||
"@united-workforce/agent-claude-code": patch
|
|
||||||
"@united-workforce/agent-builtin": patch
|
|
||||||
"@united-workforce/agent-mock": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: suppress ExperimentalWarning, PEP 668 pip guidance, setup help (#116)
|
|
||||||
|
|
||||||
- All CLI bins use shebang `#!/usr/bin/env -S node --disable-warning=ExperimentalWarning`
|
|
||||||
- Remove NODE_OPTIONS injection from spawn (shebang handles it)
|
|
||||||
- Bootstrap pip install guidance covers venv/pipx/source options for PEP 668 systems
|
|
||||||
- `uwf setup --help` mentions interactive wizard mode
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: setup UX improvements (#114)
|
|
||||||
|
|
||||||
- Setup validates adapter availability and prints install command if missing
|
|
||||||
- Setup prints "Config saved to <path> ✓" on success
|
|
||||||
- Spawn ENOENT gives actionable error ("not found in PATH" + which command)
|
|
||||||
- SQLite ExperimentalWarning suppressed via NODE_OPTIONS in spawned processes
|
|
||||||
- Bootstrap VERSION reads cli package version (was reading util version)
|
|
||||||
- Bootstrap PATH guidance is shell-agnostic (no hardcoded .bashrc/.profile)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": minor
|
|
||||||
"@united-workforce/util": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
feat: replace $START `_` status with `new`/`resume` semantics
|
|
||||||
|
|
||||||
BREAKING: All workflow YAML files must update `$START._` to `$START.new` + `$START.resume`.
|
|
||||||
The `resume` edge prompt replaces the previously hardcoded resume message in the CLI.
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
---
|
|
||||||
"@united-workforce/cli": patch
|
|
||||||
"@united-workforce/util": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: unify $status to const-only, drop enum support (#123)
|
|
||||||
|
|
||||||
Breaking: `$status` in frontmatter now requires `const` everywhere.
|
|
||||||
`enum` is no longer accepted and will be rejected by the validator.
|
|
||||||
|
|
||||||
- Validator: `hasStatusConst()` / `getConstStatuses()` replace enum-based checks
|
|
||||||
- Error message: "must define $status as const (or oneOf with const)"
|
|
||||||
- workflow-authoring docs: all examples use `const`, enum explicitly noted as unsupported
|
|
||||||
- bootstrap hello.yaml: `$status: { const: done }`
|
|
||||||
- All test fixtures migrated from enum to const/oneOf
|
|
||||||
+133
-56
@@ -1,63 +1,140 @@
|
|||||||
name: "debate"
|
name: debate
|
||||||
description: "Structured debate between two sides. Tests cross-process session resume."
|
description: "Structured two-side debate with host summary. Demonstrates multi-role coordination, oneOf output routing, and bounded termination."
|
||||||
|
|
||||||
roles:
|
roles:
|
||||||
against:
|
proponent:
|
||||||
description: "Argues against the proposition"
|
description: "Argues FOR the proposition"
|
||||||
goal: |
|
goal: "Build a compelling case for the proposition through logical reasoning and evidence"
|
||||||
You are a skilled debater arguing AGAINST the proposition.
|
capabilities: []
|
||||||
Be logical, cite evidence, and directly address your opponent's points.
|
|
||||||
Keep each argument concise (under 200 words).
|
|
||||||
capabilities:
|
|
||||||
- argumentation
|
|
||||||
- critical-thinking
|
|
||||||
procedure: |
|
procedure: |
|
||||||
1. If this is the opening, present your strongest argument against the proposition.
|
You are an experienced scholar arguing FOR the proposition.
|
||||||
2. If responding to the other side, directly counter their points with evidence and logic.
|
|
||||||
3. If you find yourself genuinely convinced by the other side, you may concede.
|
## Critical Thinking Framework (apply before every response)
|
||||||
output: |
|
|
||||||
Provide your argument in the frontmatter.
|
### A. Pre-response reflection (internal, do not output)
|
||||||
Set status to "conceded" ONLY if you are genuinely convinced and wish to stop debating.
|
- Does every step in my argument chain hold? Any hidden assumptions?
|
||||||
Otherwise set status to "continue".
|
- If I were my opponent, how would I attack this? Where am I weakest?
|
||||||
|
- Does my evidence actually support my claim, or could it backfire?
|
||||||
|
|
||||||
|
### B. Evidence discipline
|
||||||
|
- Verify key numbers — watch for order-of-magnitude errors
|
||||||
|
- Assess data freshness — fast-moving fields have short half-lives
|
||||||
|
- Distinguish primary data from secondary citations, expert opinion, and common assumptions
|
||||||
|
|
||||||
|
### C. Anti-fragility
|
||||||
|
- Anticipate counterarguments; preemptively strengthen or strategically abandon weak points
|
||||||
|
- Catch logical gaps, data misuse, or outdated claims in your opponent's reasoning
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
1. Check Thread Progress to see how many times you have spoken.
|
||||||
|
2. On your 3rd speech, you MUST output $status: final (closing statement).
|
||||||
|
3. If genuinely convinced by the opponent, output $status: conceded.
|
||||||
|
4. Otherwise output $status: speak and counter the opponent's points.
|
||||||
|
5. Be rigorous, cite evidence, stay concise.
|
||||||
|
output: "Debate argument"
|
||||||
|
frontmatter:
|
||||||
|
type: object
|
||||||
|
oneOf:
|
||||||
|
- properties:
|
||||||
|
$status: { const: speak }
|
||||||
|
argument: { type: string }
|
||||||
|
required: [$status, argument]
|
||||||
|
- properties:
|
||||||
|
$status: { const: conceded }
|
||||||
|
reason: { type: string }
|
||||||
|
required: [$status, reason]
|
||||||
|
- properties:
|
||||||
|
$status: { const: final }
|
||||||
|
closing: { type: string }
|
||||||
|
required: [$status, closing]
|
||||||
|
|
||||||
|
opponent:
|
||||||
|
description: "Argues AGAINST the proposition"
|
||||||
|
goal: "Build a compelling case against the proposition through logical reasoning and evidence"
|
||||||
|
capabilities: []
|
||||||
|
procedure: |
|
||||||
|
You are an experienced scholar arguing AGAINST the proposition.
|
||||||
|
|
||||||
|
## Critical Thinking Framework (apply before every response)
|
||||||
|
|
||||||
|
### A. Pre-response reflection (internal, do not output)
|
||||||
|
- Does every step in my argument chain hold? Any hidden assumptions?
|
||||||
|
- If I were my opponent, how would I attack this? Where am I weakest?
|
||||||
|
- Does my evidence actually support my claim, or could it backfire?
|
||||||
|
|
||||||
|
### B. Evidence discipline
|
||||||
|
- Verify key numbers — watch for order-of-magnitude errors
|
||||||
|
- Assess data freshness — fast-moving fields have short half-lives
|
||||||
|
- Distinguish primary data from secondary citations, expert opinion, and common assumptions
|
||||||
|
|
||||||
|
### C. Anti-fragility
|
||||||
|
- Anticipate counterarguments; preemptively strengthen or strategically abandon weak points
|
||||||
|
- Catch logical gaps, data misuse, or outdated claims in your opponent's reasoning
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
1. Check Thread Progress to see how many times you have spoken.
|
||||||
|
2. On your 3rd speech, or when the proponent has issued a final statement, you MUST output $status: final.
|
||||||
|
3. If genuinely convinced by the proponent, output $status: conceded.
|
||||||
|
4. Otherwise output $status: speak and counter the proponent's points.
|
||||||
|
5. Be rigorous, cite evidence, stay concise.
|
||||||
|
output: "Debate argument"
|
||||||
|
frontmatter:
|
||||||
|
type: object
|
||||||
|
oneOf:
|
||||||
|
- properties:
|
||||||
|
$status: { const: speak }
|
||||||
|
argument: { type: string }
|
||||||
|
required: [$status, argument]
|
||||||
|
- properties:
|
||||||
|
$status: { const: conceded }
|
||||||
|
reason: { type: string }
|
||||||
|
required: [$status, reason]
|
||||||
|
- properties:
|
||||||
|
$status: { const: final }
|
||||||
|
closing: { type: string }
|
||||||
|
required: [$status, closing]
|
||||||
|
|
||||||
|
host:
|
||||||
|
description: "Debate moderator — delivers impartial summary and verdict"
|
||||||
|
goal: "Objectively review the debate, analyze both sides, and deliver a verdict"
|
||||||
|
capabilities: []
|
||||||
|
procedure: |
|
||||||
|
You are an experienced academic debate moderator.
|
||||||
|
|
||||||
|
## Task
|
||||||
|
1. Outline each side's core arguments
|
||||||
|
2. Evaluate reasoning quality and evidence use
|
||||||
|
3. Highlight the most impactful exchanges
|
||||||
|
4. Analyze the deeper significance of the topic
|
||||||
|
5. Deliver an overall verdict
|
||||||
|
|
||||||
|
## Style
|
||||||
|
- Impartial but with independent judgment
|
||||||
|
- Substantive, not superficial
|
||||||
|
output: "Debate summary report"
|
||||||
frontmatter:
|
frontmatter:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
$status:
|
$status: { const: done }
|
||||||
enum: ["continue", "conceded"]
|
summary: { type: string }
|
||||||
argument:
|
highlights: { type: string }
|
||||||
type: string
|
verdict: { type: string }
|
||||||
required: [$status, argument]
|
required: [$status, summary, highlights, verdict]
|
||||||
for:
|
|
||||||
description: "Argues for the proposition"
|
|
||||||
goal: |
|
|
||||||
You are a skilled debater arguing FOR the proposition.
|
|
||||||
Be logical, cite evidence, and directly address your opponent's points.
|
|
||||||
Keep each argument concise (under 200 words).
|
|
||||||
capabilities:
|
|
||||||
- argumentation
|
|
||||||
- critical-thinking
|
|
||||||
procedure: |
|
|
||||||
1. Read the opposing side's latest argument carefully.
|
|
||||||
2. Counter their points with evidence and logic.
|
|
||||||
3. If you find yourself genuinely convinced by the other side, you may concede.
|
|
||||||
output: |
|
|
||||||
Provide your argument in the frontmatter.
|
|
||||||
Set status to "conceded" ONLY if you are genuinely convinced and wish to stop debating.
|
|
||||||
Otherwise set status to "continue".
|
|
||||||
frontmatter:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
$status:
|
|
||||||
enum: ["continue", "conceded"]
|
|
||||||
argument:
|
|
||||||
type: string
|
|
||||||
required: [$status, argument]
|
|
||||||
graph:
|
graph:
|
||||||
$START:
|
$START:
|
||||||
new: { role: "against", prompt: "Present your opening argument against the proposition." }
|
new: { role: proponent, prompt: "The debate begins. You are arguing FOR the proposition. Present your opening argument." }
|
||||||
resume: { role: "against", prompt: "Review the previous debate output and continue the argument against the proposition." }
|
resume: { role: proponent, prompt: "The debate continues." }
|
||||||
against:
|
|
||||||
conceded: { role: "$END", prompt: "The against side conceded. Debate over." }
|
proponent:
|
||||||
continue: { role: "for", prompt: "Counter the opposing argument: {{{argument}}}" }
|
speak: { role: opponent, prompt: "Proponent argues:\n\n{{{argument}}}\n\nYou are the opponent. Counter this argument." }
|
||||||
for:
|
conceded: { role: host, prompt: "The proponent conceded: {{{reason}}}\n\nPlease summarize the debate." }
|
||||||
conceded: { role: "$END", prompt: "The for side conceded. Debate over." }
|
final: { role: opponent, prompt: "Proponent's closing statement:\n\n{{{closing}}}\n\nYou are the opponent. Deliver your final response." }
|
||||||
continue: { role: "against", prompt: "Counter the opposing argument: {{{argument}}}" }
|
|
||||||
|
opponent:
|
||||||
|
speak: { role: proponent, prompt: "Opponent argues:\n\n{{{argument}}}\n\nYou are the proponent. Counter this argument." }
|
||||||
|
conceded: { role: host, prompt: "The opponent conceded: {{{reason}}}\n\nPlease summarize the debate." }
|
||||||
|
final: { role: host, prompt: "Opponent's closing statement:\n\n{{{closing}}}\n\nThe debate is over. Please summarize." }
|
||||||
|
|
||||||
|
host:
|
||||||
|
done: { role: "$END", prompt: "Summary complete." }
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
type AgentRunResult,
|
type AgentRunResult,
|
||||||
buildContinuationPrompt,
|
buildContinuationPrompt,
|
||||||
buildRolePrompt,
|
buildRolePrompt,
|
||||||
|
buildThreadProgress,
|
||||||
createAgent,
|
createAgent,
|
||||||
getCachedSessionId,
|
getCachedSessionId,
|
||||||
setCachedSessionId,
|
setCachedSessionId,
|
||||||
@@ -27,6 +28,10 @@ export function buildClaudeCodePrompt(ctx: AgentContext): string {
|
|||||||
if (ctx.outputFormatInstruction !== undefined && ctx.outputFormatInstruction !== "") {
|
if (ctx.outputFormatInstruction !== undefined && ctx.outputFormatInstruction !== "") {
|
||||||
parts.push(ctx.outputFormatInstruction, "");
|
parts.push(ctx.outputFormatInstruction, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inject thread progress so the agent knows step count and role visit count
|
||||||
|
parts.push(buildThreadProgress(ctx.steps, ctx.role), "");
|
||||||
|
|
||||||
parts.push(rolePrompt, "", "## Task", ctx.start.prompt);
|
parts.push(rolePrompt, "", "## Task", ctx.start.prompt);
|
||||||
|
|
||||||
if (!ctx.isFirstVisit) {
|
if (!ctx.isFirstVisit) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
type AgentRunResult,
|
type AgentRunResult,
|
||||||
buildContinuationPrompt,
|
buildContinuationPrompt,
|
||||||
buildRolePrompt,
|
buildRolePrompt,
|
||||||
|
buildThreadProgress,
|
||||||
createAgent,
|
createAgent,
|
||||||
} from "@united-workforce/util-agent";
|
} from "@united-workforce/util-agent";
|
||||||
import type { AcpUsage } from "./acp-client.js";
|
import type { AcpUsage } from "./acp-client.js";
|
||||||
@@ -60,6 +61,9 @@ export function buildHermesPrompt(ctx: AgentContext): string {
|
|||||||
parts.push(ctx.outputFormatInstruction, "");
|
parts.push(ctx.outputFormatInstruction, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inject thread progress so the agent knows step count and role visit count
|
||||||
|
parts.push(buildThreadProgress(ctx.steps, ctx.role), "");
|
||||||
|
|
||||||
if (!ctx.isFirstVisit) {
|
if (!ctx.isFirstVisit) {
|
||||||
// Re-entry: show only steps since last visit, meta only
|
// Re-entry: show only steps since last visit, meta only
|
||||||
parts.push(buildContinuationPrompt(ctx.steps, ctx.role, ctx.edgePrompt));
|
parts.push(buildContinuationPrompt(ctx.steps, ctx.role, ctx.edgePrompt));
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
import type { StepContext } from "@united-workforce/protocol";
|
||||||
|
import { describe, expect, test } from "vitest";
|
||||||
|
import { buildThreadProgress } from "../src/build-thread-progress.js";
|
||||||
|
|
||||||
|
function makeStep(role: string): StepContext {
|
||||||
|
return {
|
||||||
|
role,
|
||||||
|
output: {},
|
||||||
|
detail: "0000000000000" as string,
|
||||||
|
agent: "uwf-mock",
|
||||||
|
edgePrompt: "",
|
||||||
|
startedAtMs: 0,
|
||||||
|
completedAtMs: 0,
|
||||||
|
cwd: "",
|
||||||
|
assembledPrompt: null,
|
||||||
|
usage: null,
|
||||||
|
content: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("buildThreadProgress", () => {
|
||||||
|
test("first step of thread", () => {
|
||||||
|
const result = buildThreadProgress([], "proponent");
|
||||||
|
expect(result).toContain("## Thread Progress");
|
||||||
|
expect(result).toContain("first step");
|
||||||
|
expect(result).toContain("first time");
|
||||||
|
expect(result).toContain("proponent");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("second step, role not seen before", () => {
|
||||||
|
const steps = [makeStep("opponent")];
|
||||||
|
const result = buildThreadProgress(steps, "proponent");
|
||||||
|
expect(result).toContain("Thread step 2");
|
||||||
|
expect(result).toContain("spoken 0 times");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("role has spoken once before", () => {
|
||||||
|
const steps = [makeStep("proponent"), makeStep("opponent")];
|
||||||
|
const result = buildThreadProgress(steps, "proponent");
|
||||||
|
expect(result).toContain("Thread step 3");
|
||||||
|
expect(result).toContain("spoken 1 time before");
|
||||||
|
// singular "time" not "times"
|
||||||
|
expect(result).not.toContain("1 times");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("role has spoken multiple times", () => {
|
||||||
|
const steps = [
|
||||||
|
makeStep("proponent"),
|
||||||
|
makeStep("opponent"),
|
||||||
|
makeStep("proponent"),
|
||||||
|
makeStep("opponent"),
|
||||||
|
makeStep("proponent"),
|
||||||
|
makeStep("opponent"),
|
||||||
|
];
|
||||||
|
const result = buildThreadProgress(steps, "proponent");
|
||||||
|
expect(result).toContain("Thread step 7");
|
||||||
|
expect(result).toContain("spoken 3 times");
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import type { StepContext } from "@united-workforce/protocol";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a compact thread-progress summary so the agent knows where it is
|
||||||
|
* in the conversation without making tool calls to count steps.
|
||||||
|
*
|
||||||
|
* Example output:
|
||||||
|
* ## Thread Progress
|
||||||
|
* Thread step 6. You (proponent) have spoken 2 times before this turn.
|
||||||
|
*/
|
||||||
|
export function buildThreadProgress(steps: StepContext[], role: string): string {
|
||||||
|
const totalSteps = steps.length;
|
||||||
|
const roleVisits = steps.filter((s) => s.role === role).length;
|
||||||
|
|
||||||
|
const parts = [`## Thread Progress`];
|
||||||
|
if (totalSteps === 0) {
|
||||||
|
parts.push(
|
||||||
|
`This is the first step of the thread. You (${role}) are speaking for the first time.`,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
parts.push(
|
||||||
|
`Thread step ${totalSteps + 1}. You (${role}) have spoken ${roleVisits} time${roleVisits === 1 ? "" : "s"} before this turn.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return parts.join("\n");
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
export { buildContinuationPrompt } from "./build-continuation-prompt.js";
|
export { buildContinuationPrompt } from "./build-continuation-prompt.js";
|
||||||
export { buildOutputFormatInstruction } from "./build-output-format-instruction.js";
|
export { buildOutputFormatInstruction } from "./build-output-format-instruction.js";
|
||||||
export { buildRolePrompt } from "./build-role-prompt.js";
|
export { buildRolePrompt } from "./build-role-prompt.js";
|
||||||
|
export { buildThreadProgress } from "./build-thread-progress.js";
|
||||||
export type { BuildContextMeta } from "./context.js";
|
export type { BuildContextMeta } from "./context.js";
|
||||||
export { buildContext, buildContextWithMeta } from "./context.js";
|
export { buildContext, buildContextWithMeta } from "./context.js";
|
||||||
export type { ExtractResult, ResolvedLlmProvider } from "./extract.js";
|
export type { ExtractResult, ResolvedLlmProvider } from "./extract.js";
|
||||||
|
|||||||
@@ -140,5 +140,18 @@ For specific scenarios, run the corresponding \`uwf prompt\` command:
|
|||||||
|----------|---------|-------------|
|
|----------|---------|-------------|
|
||||||
| Writing workflow YAML | \`uwf prompt workflow-authoring\` | Designing roles, conditions, graphs, and edge prompts |
|
| Writing workflow YAML | \`uwf prompt workflow-authoring\` | Designing roles, conditions, graphs, and edge prompts |
|
||||||
| Building a new agent adapter | \`uwf prompt adapter-developing\` | Creating a new \`uwf-<name>\` CLI adapter |
|
| Building a new agent adapter | \`uwf prompt adapter-developing\` | Creating a new \`uwf-<name>\` CLI adapter |
|
||||||
|
|
||||||
|
## Upgrading
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
# Install the latest version
|
||||||
|
pnpm add -g @united-workforce/cli@latest @united-workforce/agent-hermes@latest
|
||||||
|
# or: npm install -g @united-workforce/cli@latest @united-workforce/agent-hermes@latest
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
uwf --version
|
||||||
|
|
||||||
|
# Then run uwf prompt bootstrap and follow the upgrade instructions
|
||||||
|
\`\`\`
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user